В этой статье мы поговорим о том, как ускорить парсинг веб -страниц с помощью модуля запросов с помощью модуля HTTPX и AsyncIO путем одновременной выборки запросов.
Пользователь должен быть знаком с Python. Знание модуля «Запросы» или парсинга веб-страниц будет преимуществом.
Требуемый модуль
Для этого урока мы будем использовать 4 модуля:
- time
- requests
- httpx
- asyncio.
pip install httpx
pip install requests
time и asyncio предустановлены, поэтому их не нужно устанавливать.
Использование модуля запросов для получения необходимого времени —
Сначала мы будем использовать традиционный способ получения URL-адресов с помощью метода get() модуля запросов, затем с помощью модуля времени мы проверим общее затраченное время.
Python3
import
time
import
requests
def
fetch_urls():
urls
=
[
"https://en.wikipedia.org/wiki/Badlands"
,
"https://en.wikipedia.org/wiki/Canyon"
,
"https://en.wikipedia.org/wiki/Cave"
,
"https://en.wikipedia.org/wiki/Cliff"
,
"https://en.wikipedia.org/wiki/Coast"
,
"https://en.wikipedia.org/wiki/Continent"
,
"https://en.wikipedia.org/wiki/Coral_reef"
,
"https://en.wikipedia.org/wiki/Desert"
,
"https://en.wikipedia.org/wiki/Forest"
,
"https://en.wikipedia.org/wiki/Geyser"
,
"https://en.wikipedia.org/wiki/Mountain_range"
,
"https://en.wikipedia.org/wiki/Peninsula"
,
"https://en.wikipedia.org/wiki/Ridge"
,
"https://en.wikipedia.org/wiki/Savanna"
,
"https://en.wikipedia.org/wiki/Shoal"
,
"https://en.wikipedia.org/wiki/Steppe"
,
"https://en.wikipedia.org/wiki/Tundra"
,
"https://en.wikipedia.org/wiki/Valley"
,
"https://en.wikipedia.org/wiki/Volcano"
,
"https://en.wikipedia.org/wiki/Artificial_island"
,
"https://en.wikipedia.org/wiki/Lake"
]
res
=
[requests.get(addr).status_code
for
addr
in
urls]
(
set
(res))
start
=
time.time()
fetch_urls()
end
=
time.time()
(
"Total Consumed Time"
,end
-
start)
Сначала мы импортировали модуль запросов и времени, затем создали функцию fetch_urls(), внутри которой мы создали список, состоящий из 20 ссылок (пользователь может выбрать любое количество любых существующих случайных ссылок). Затем внутри переменной res, которая является типом списка, мы используем метод get() с методом status_code модуля запросов, чтобы отправить запрос на каждую из этих ссылок, а также получить и сохранить их коды состояния в виде списка. Затем, наконец, мы печатаем набор этого разрешения.Теперь основная причина преобразования его в набор заключается в том, что если все сайты работают, то все вернут код состояния 200, поэтому его установка будет только одним значением, поэтому потребление времени будет меньше в этой работе (Мотив состоит в том, чтобы использовать как можно меньше времени как это возможно в других работах).
Затем вне функции, используя метод time() модуля time, мы сохраняем время начала и окончания, а также время между вызовами функции. Затем, наконец, печать общего затраченного времени.
Вывод:
Из вывода видно, что он израсходовал всего 12,6422558 секунд.
Использование HTTPX с AsyncIO
Python3
import
time
import
asyncio
import
httpx
async
def
fetch_httpx():
urls
=
[
"https://en.wikipedia.org/wiki/Badlands"
,
"https://en.wikipedia.org/wiki/Canyon"
,
"https://en.wikipedia.org/wiki/Cave"
,
"https://en.wikipedia.org/wiki/Cliff"
,
"https://en.wikipedia.org/wiki/Coast"
,
"https://en.wikipedia.org/wiki/Continent"
,
"https://en.wikipedia.org/wiki/Coral_reef"
,
"https://en.wikipedia.org/wiki/Desert"
,
"https://en.wikipedia.org/wiki/Forest"
,
"https://en.wikipedia.org/wiki/Geyser"
,
"https://en.wikipedia.org/wiki/Mountain_range"
,
"https://en.wikipedia.org/wiki/Peninsula"
,
"https://en.wikipedia.org/wiki/Ridge"
,
"https://en.wikipedia.org/wiki/Savanna"
,
"https://en.wikipedia.org/wiki/Shoal"
,
"https://en.wikipedia.org/wiki/Steppe"
,
"https://en.wikipedia.org/wiki/Tundra"
,
"https://en.wikipedia.org/wiki/Valley"
,
"https://en.wikipedia.org/wiki/Volcano"
,
"https://en.wikipedia.org/wiki/Artificial_island"
,
"https://en.wikipedia.org/wiki/Lake"
]
async with httpx.AsyncClient() as httpx_client:
req
=
[httpx_client.get(addr)
for
addr
in
urls]
result
=
await asyncio.gather(
*
req)
start
=
time.time()
asyncio.run(fetch_httpx())
end
=
time.time()
(
"Total Consumed Time using HTTPX"
,end
-
start)
Мы должны использовать asyncio с HTTPX, иначе мы не сможем отправлять запросы одновременно. Сам HTTPX имеет встроенный клиент AsyncIO, который мы будем использовать здесь, для использования внутри функции, которая должна быть асинхронной. Мы вызываем метод AsyncClient() модуля HTTPX, используя псевдоним httpx_client, затем, используя этот псевдоним, мы одновременно отправляем запросы по тем же ссылкам, которые использовались ранее. Затем, поскольку мы используем асинхронный режим, мы должны использовать await, с помощью которого мы собираем ответ и сохраняем его в результате. (Если пользователь хочет, он также может распечатать это, но, поскольку я намерен сократить время, затрачиваемое на другие операции, а не на получение запросов, я их не печатал.).
Затем извне функции, используя метод asyncio.run(), мы вызываем эту функцию, а затем печатаем результат общего затраченного времени.
Вывод:
Как видно из вывода, общее затраченное время уменьшилось почти в 6 раз. Эта разница может измениться в любое время. Если мы снова и снова отправляем запросы на один и тот же URL-адрес, то время, затрачиваемое как на запросы, так и на HTTPX, будет меньше, чем в прошлый раз, поэтому эта разница будет больше увеличиваться.