23  Работа с сетями. Веб-запросы и API

23.1 Рекомендуемая литература

  • Лекция №10, 11

  • Asyncio и конкурентное программирование на Python, глава 4

23.2 Цели и задачи

Цель - освоить использование веб-запросов в синхронном и асинхронном режиме с использованием Python

Задачи:

  1. Освоить базовые принципы REST API базы данных Uniprot

  2. Реализовать синхронную обработку HTTP-запросов к Uniprot с помощью библиотеки requests

  3. Реализовать асинхронную обработку HTTP-запросов к Uniprot с помощью библиотеки aiohttp

  4. Сравнить работу синхронного и асинхронного режимов.

23.3 Ход выполнения работы

23.3.1 Подготовительная часть

  1. Создайте окружение для работы

    conda create -n http -c conda-forge pandas requests aiohttp
  2. Создайте таблицу с идентификаторами для запроса. Для этого достаточно в поиске Uniprot вбить “human” и выберите режим отображения table view. Затем скопируйте первую сотню записей в Excel и схраните.

  3. Изучите примеры использования Uniprot REST API

    Пример

    Формат ссылки для скачивания последовательности по идентификатору в формате fasta

    https://rest.uniprot.org/uniprotkb/search?query={id}&format=fasta

23.3.2 Запросы к веб-сервису

  1. Сначала реализуйте запросы с помощью библиотеки requests. Результаты - последовательности в формате fasta - сохраняйте в один файл. Не забывайте, что вы отправляете запросы GET. Вам необходимо реализовать обработку сетевых ошибок. Проверьте правильность на малом количестве идентификаторов. Измерьте зависимость времени работы от количества входных данных

    Важно

    Не забывайте прерывать выполнение вашей программы с помощью функции sleep, чтобы Uniprot не подумал, что на него совершают DDos-атаку. Кстати, что это такое?

    Пример отправки запроса с помощью библиотеки requests

    uniprot_id = "P12345"
    query_link = f"https://rest.uniprot.org/uniprotkb/search?query={uniprot_id}&format=fasta"
    
    try:
    1    response = requests.get(query_link)
    2    if response.status_code == requests.codes['ok']:
            print(response.text) 
        else:
    3        response.raise_for_status()
    except requests.HTTPError as e: 
        print(f"Произошла ошибка при запросе {str(e)}")
        traceback.print_exc()
    1
    Отправляем запрос по протоколу HTTPS, используя метод GET, на сервис. Запрос содержится в параметрах, указанных в URL.
    2
    Если ответ сервера содержит код успешной проведенной операции, то читаем результат запроса - последовательность белка в формате fasta
    3
    Если ответ сервера содержит иной код, выбрасываем исключение.
  2. Реализуйте запросы с помощью библиотеки aiohttp. Измерьте зависимость времени работы от количества входных данных.

    Пример отправки запроса с помощью библиотеки aiohttp

    import aiohttp
    import asyncio
    
    async def fetch_uniprot_data(uniprot_id):
        query_link = f"https://rest.uniprot.org/uniprotkb/search?query={uniprot_id}&format=fasta"
    
    1    async with aiohttp.ClientSession() as session:
            try:
    2            async with session.get(query_link) as response:
    3                if response.status == 200:
    4                    data = await response.text()
                        print(data)
                    else:
    5                    response.raise_for_status()
            except aiohttp.ClientError as e:
                print(f"Произошла ошибка при запросе: {str(e)}")
    
    uniprot_id = "P12345"
    asyncio.run(fetch_uniprot_data(uniprot_id))
    1
    Такая конструкция называется асинхронных менеджер контекста и нужен для корректной обработки ресурса: автоматического открытия и закрытия как в нормальной, так и в нештатной ситуациях. Здесь создаем асинхронную клиентскую сессию, которой будут пренадлежать отдаваемые запросы
    2
    Отправка запроса на сервер. Также через менеджер контекста, потому что корутина может приостановить своё выполнение.
    3
    200 - код успешного выполнения запроса
    4
    Ожидание результата запроса
    5
    Если код ошибки, отличный от 200, выбрасываем ошибку.
  3. Сравните результаты по следующим параметрам: время работы скрипта на разном количестве входных данных, количество сбоев - и сделайте выводы.

23.4 Вопросы к защите

  1. Протокол HTTPS. Принципы работы

  2. Протокол TCP, UDP. Разница и применение. Структура пакета.

  3. Протокол IP. Структура пакета

  4. Доменное имя. Структура URL

  5. Прикладной интерфейс приложения.

  6. Библиотеки requests и aiohttp. Разница и применение.