Жизнь слишком коротка, я использую Python
Предыдущий портал:
Xiaobai изучает поисковый робот Python (1): начало
Xiaobai Learns Python Crawler (3): Предварительная подготовка (2) Введение в основы Linux
Xiaobai Learns Python Crawler (4): Предварительная подготовка (3) Введение в основы Docker
Xiaobai Learns Python Crawler (5): предварительная подготовка (4) Основы базы данных
Xiaobai изучает краулер Python (6): предварительная подготовка (5) установка фреймворка краулера
Xiaobai изучает поисковый робот Python (7): основы HTTP
Xiaobai изучает поисковый робот Python (8): основа веб-страницы
Xiaobai изучает краулер Python (9): основы краулера
Xiaobai изучает поисковый робот Python (10): сеанс и файлы cookie
Xiaobai изучает поисковый робот Python (11): основы использования urllib (1)
Xiaobai изучает поисковый робот Python (12): основы использования urllib (2)
Xiaobai изучает поисковый робот Python (13): основы использования urllib (3)
Xiaobai изучает поисковый робот Python (14): основы использования urllib (4)
Xiaobai изучает поисковый робот Python (15): базовое использование urllib (5)
Xiaobai изучает краулер Python (16): реальная битва urllib с ползающей сестринской картой
Xiaobai изучает поисковый робот Python (17): основы использования запросов
Xiaobai изучает поисковый робот Python (18): запрашивает расширенную операцию
Xiaobai изучает поисковый робот Python (19): основные операции Xpath
Xiaobai изучает поисковый робот Python (20): расширенный Xpath
Xiaobai изучает поисковый робот Python (21): библиотека синтаксического анализа Beautiful Soup (1)
Xiaobai изучает поисковый робот Python (22): анализ библиотеки Beautiful Soup (часть 2)
Xiaobai изучает поисковый робот Python (23): введение в синтаксический анализ библиотеки pyquery
Сяобай изучает поисковый робот Python (24): рейтинг фильмов Douban за 2019 год
Xiaobai изучает поисковый робот Python (25): сканирование информации о запасах
Xiaobai изучает поисковый робот Python (30): основа агента
Xiaobai изучает поисковый робот Python (31): самостоятельно создайте простой пул прокси-серверов
PS: Простите редактора за одну вещь.Предыдущая ссылка на портал, отправленная официальной учетной записью вчера, была неверной, что привело к сбою всех подключений.В Wechat есть ограничения на изменение статей, которые уже были отправлены, поддерживает только удаление и изменение, и не поддерживает добавление ссылок.Я искренне извиняюсь перед всеми.
Зачем нужна библиотека асинхронных запросов
Как обычно, сначала ставьте официальную ссылку:
Официальная документация: https://docs.aiohttp.org/en/stable/
Жаль, что нет китайской версии этого.Программа для перевода, которая идет в комплекте с браузером, может обойтись без этого.Если вы не понимаете этого, прочитайте исходный текст.
Причина, конечно, очень проста, поторопитесь~~~
Аааа, нет, это эффективно.
Как определить высокий КПД? Если интерфейс сканирования или страница не имеют логической связи до и после, например: вы должны сначала получить определенные данные со страницы а, чтобы указать ссылку доступа к странице б, что называется логической связью между до и после.
Во многих случаях сканирование страниц не имеет логической связи до и после.При использовании библиотеки синхронных запросов, такой как Requests, мы можем только дождаться, пока запрос сначала выйдет, а затем вернуться, прежде чем отправлять следующий запрос.
Если его заменить на библиотеку асинхронных запросов, такого ожидания не будет, при отправке запроса ему будет все равно, когда на запрос будет дан ответ, и будет отправлен следующий запрос, а затем следующий запрос.
Конечно, библиотека асинхронных запросов также предоставляет нам методы обратного вызова, иначе мы не знаем, когда на запрос будет получен ответ и когда вернутся нужные нам данные.
Давайте сначала рассмотрим простой пример, давайте сначала интуитивно почувствуем, насколько быстрее может быть библиотека асинхронных запросов, чем библиотека синхронных запросов.
Здесь используется веб-сайт Du Niang (на самом деле я хотел использовать Github, но мобильная широкополосная сеть, используемая редактором, слишком ххх, и ее нельзя запустить десять раз в цикле), но у меня нет другого выбора, кроме как сменить Du Niang и посетить 100 раз, потому что 10 раз слишком мало, чтобы увидеть разницу.
Пример версии запросов
Пример кода выглядит следующим образом:
import requests
from datetime import datetime
start = datetime.now()
for i in range(100):
print(requests.get('https://www.baidu.com/').text)
end = datetime.now()
print("request花费时间为:", end - start)
Результат выглядит следующим образом:
request花费时间为: 0:00:13.410708
Другие редакторы печати не вставят их сюда, просто вставят печать последней разницы во времени.
Пример версии AioHttp
Пример кода выглядит следующим образом:
import aiohttp
import asyncio
from datetime import datetime
async def main():
async with aiohttp.ClientSession() as client:
html = await client.get('https://www.baidu.com/')
print(html)
loop = asyncio.get_event_loop()
tasks = []
for i in range(100):
task = loop.create_task(main())
tasks.append(task)
start = datetime.now()
loop.run_until_complete(main())
end = datetime.now()
print("aiohttp花费时间为:", end - start)
Результат выглядит следующим образом:
aiohttp花费时间为: 0:00:00.249995
Уважаемые одноклассники а вы его видели?Скорость доступа очень разная.Один занял больше 13с,а другой даже 1с не дотянул.Не хочу забывать промежуток между ними,слишком большой.
Тем не менее, скорость доступа очень высока, и скорость блокировки посещения веб-сайтов с IP-защитой также очень высока.Возможно, IP-адрес был заблокирован до того, как чашка чая была поднята, как только сканер начал работать.
базовое упражнение
Далее давайте кратко разберемся с некоторыми основными операциями AIOHTTP.
Отправить запрос
Образец кода:
import aiohttp
import asyncio
async def aio_1():
async with aiohttp.ClientSession() as session:
async with session.get('https://www.baidu.com/') as resp:
print(resp.status)
print(await resp.text())
loop = asyncio.get_event_loop()
loop.run_until_complete(aio_1())
Результат не будет опубликован, это в основном для того, чтобы показать студентам, как использовать AIOHTTP для отправки запросов.
Здесь мы используем ClientSession в качестве вызываемого сеанса и объект ClientResponse в качестве результата ответа.
Ниже приведена подсказка из официальной документации:
Уведомление:
Не создавайте сеанс для каждого запроса. Каждому приложению, скорее всего, потребуется сеанс для выполнения всех запросов.
В более сложных случаях может потребоваться один сеанс для каждого сайта, например, один сеанс для Github и другой для Facebook API. В любом случае, создание сеанса для каждого запроса - очень плохая идея.
Сеанс содержит внутренний пул соединений. Повторное использование соединения и поддержка активности (оба включены по умолчанию) могут улучшить общую производительность.
отклик
Давайте посмотрим на пример:
async def aio_2():
async with aiohttp.ClientSession() as session:
async with session.get('https://www.geekdigging.com/') as resp:
print(resp.status)
print(await resp.text())
loop = asyncio.get_event_loop()
loop.run_until_complete(aio_2())
AIOHTTP предоставляет нам функцию автоматического декодирования,
Примером здесь является посещение блога Xiaobian.На главной странице много контента на китайском языке.Если расшифровка неверна, китайский язык не может отображаться нормально. В итоге редактор не выложит, а расшифровка правильная.
Конечно, если мы обнаружим, что автоматическое декодирование некорректно, мы можем подумать о настройке типа декодирования, код выглядит следующим образом:
await resp.text(encoding='gb2312')
Мы также можем получить доступ к ответу через поток двоичных байтов, код выглядит следующим образом:
print(await resp.read())
AIOHTTP также имеет для нас встроенный декодер JSON, который позволяет нам напрямую обрабатывать данные ответа в формате JSON Пример кода выглядит следующим образом:
print(await resp.json())
тайм-аут
Когда мы вводили другие библиотеки запросов ранее, мы столкнулись с проблемой тайм-аута, вообще говоря, мы добавим время тайм-аута к запросу, затем в AIOHTTP добавим к тайм-ауту следующий пример кода:
async def aio_3():
timeout = aiohttp.ClientTimeout(total=60)
async with aiohttp.ClientSession(timeout = timeout) as session:
async with session.get('https://www.geekdigging.com/', timeout = timeout) as resp:
print(resp.status)
loop = asyncio.get_event_loop()
loop.run_until_complete(aio_3())
Если мы не установим время ожидания, AIOHTTP установит время ожидания для нас по умолчанию на 5 минут.Если мы установим время ожидания, оно будет зависеть от того, что мы установили.Настройка времени ожидания может быть установлена в два места Редактор уже включил в пример Все примеры приведены.
Мы можем напрямую установить период тайм-аута при создании ClientSession.В это время весь период тайм-аута действителен в текущем сеансе.Если в последующих вызовах, таких какClientSession.get():Сброс периода ожидания в сеансе клиента перезапишет период ожидания, который мы установили при создании ClientSession.
И ClientTimeout Есть много других свойств, которые можно установить, список выглядит следующим образом:
- Итого: Полное время операции включает в себя установление соединения, отправку запроса и чтение ответа.
- connect: это время включает соединения, которые устанавливают новые соединения или ожидают незанятых соединений в пуле, когда превышен предел числа соединений пула.
- sock_connect: Тайм-аут для подключения к узлу для нового соединения, не полученного из пула.
- sock_read: максимальный тайм-аут, разрешенный в период между считываниями новых частей данных с однорангового узла.
Таймауты по умолчанию следующие:
aiohttp.ClientTimeout(total=5*60, connect=None,
sock_connect=None, sock_read=None)
образец кода
Все редакторы кода из этой серии будут размещены в репозиториях управления кодом Github и Gitee для вашего удобства.