Увеличьте скорость парсинга веб-страниц в Python с помощью модуля HTTPX

3 совета для начинающих разработчиков Python Изучение

В этой статье мы поговорим о том, как ускорить парсинг веб -страниц с помощью модуля запросов с помощью модуля 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]
 
    print(set(res))
 
 
 
 
start = time.time()
fetch_urls()
end = time.time()
 
print("Total Consumed Time",end-start)

Сначала мы импортировали модуль запросов и времени, затем создали функцию fetch_urls(), внутри которой мы создали список, состоящий из 20 ссылок (пользователь может выбрать любое количество любых существующих случайных ссылок). Затем внутри переменной res, которая является типом списка, мы используем метод get() с методом status_code модуля запросов, чтобы отправить запрос на каждую из этих ссылок, а также получить и сохранить их коды состояния в виде списка. Затем, наконец, мы печатаем набор этого разрешения.Теперь основная причина преобразования его в набор заключается в том, что если все сайты работают, то все вернут код состояния 200, поэтому его установка будет только одним значением, поэтому потребление времени будет меньше в этой работе (Мотив состоит в том, чтобы использовать как можно меньше времени как это возможно в других работах).

Читайте также:  Как сделать ваш сайт быстрее с помощью Performance API

Затем вне функции, используя метод time() модуля time, мы сохраняем время начала и окончания, а также время между вызовами функции. Затем, наконец, печать общего затраченного времени.

Вывод:

Затем вне функции, используя метод 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()
 
print("Total Consumed Time using HTTPX",end-start)

Мы должны использовать asyncio с HTTPX, иначе мы не сможем отправлять запросы одновременно. Сам HTTPX имеет встроенный клиент AsyncIO, который мы будем использовать здесь, для использования внутри функции, которая должна быть асинхронной. Мы вызываем метод AsyncClient() модуля HTTPX, используя псевдоним httpx_client, затем, используя этот псевдоним, мы одновременно отправляем запросы по тем же ссылкам, которые использовались ранее. Затем, поскольку мы используем асинхронный режим, мы должны использовать await, с помощью которого мы собираем ответ и сохраняем его в результате. (Если пользователь хочет, он также может распечатать это, но, поскольку я намерен сократить время, затрачиваемое на другие операции, а не на получение запросов, я их не печатал.).

Затем извне функции, используя метод asyncio.run(), мы вызываем эту функцию, а затем печатаем результат общего затраченного времени.

Вывод:

Затем извне функции, используя метод asynci

Как видно из вывода, общее затраченное время уменьшилось почти в 6 раз. Эта разница может измениться в любое время. Если мы снова и снова отправляем запросы на один и тот же URL-адрес, то время, затрачиваемое как на запросы, так и на HTTPX, будет меньше, чем в прошлый раз, поэтому эта разница будет больше увеличиваться.

Оцените статью
bestprogrammer.ru
Добавить комментарий