Начать пробный период
Назад

Асинхронные запросы в Python: ускоряем веб-скрапинг без нарушения ограничений частоты запросов

Обобщите эту статью с помощью предпочитаемого вами AI
Попробуйте наши премиум-прокси

Протестируйте наши премиум-прокси без ограничений по качеству.

  • Мобильные и резидентные прокси
  • Таргетинг на уровне ZIP
  • Статические и ротируемые IP
  • Встроенный фильтр качества
Попробовать сейчас

Веб-скраперы на Python часто работают медленно по простой причине: синхронный скрипт ждёт каждый ответ, прежде чем отправить следующий запрос. Асинхронные запросы сокращают это время простоя, удерживая несколько сетевых запросов в работе одновременно.

У скорости есть предел. Слишком быстрое повышение параллелизма может перегрузить целевой сайт, вызвать ограничения частоты запросов 429, привести к ошибкам соединения или вернуть неполные страницы. В отчёте Apify и The Web Scraping Club State of Web Scraping Report 2026, 65,8% опрошенных специалистов по скрапингу сообщили, что в 2025 году использовали больше прокси, чем годом ранее. Это отражает типичную проблему в продакшене: масштабирование скрапера означает также управление сетевым маршрутом каждого запроса. Для публичных страниц ротационные резидентские прокси позволяют не концентрировать все запросы на одном IP. Для проверки цен, локальных объявлений и других сценариев, где во время запуска нужен один постоянный регион, закреплённые сессии делают соединение более стабильным.

Это руководство построено как один пошаговый АЙО HTTP туториал: отправить один запрос, выполнить несколько запросов параллельно, ограничить параллелизм, добавить повторные попытки и сохранить результаты. Requests, asyncio.to_thread(), HTTPX и браузер для скрапинга NodeMaven рассматриваются далее как чётко обозначенные альтернативы для разных сценариев.

Масштабируйте асинхронные запросы с меньшим числом сбоев

Когда 429 появляются ошибки, нестабильные маршруты или ограничения на один IP, добавьте чистые резидентные прокси вместо дальнейшего повышения параллелизма. Протестируйте NodeMaven: 750 MB резидентного и мобильного трафика за $3,50 и держите каждый запрос на более надёжном маршруте

Попробовать сейчас

Асинхронные запросы в Python: краткий ответ

  • Следуйте АЙО HTTP руководству ниже , когда создаёте новый асинхронный скрапер.
  • Сохранять Python Requests для короткого локального скрипта или небольшого числа URL.
  • Выберите asyncio.to_thread() , когда у вас уже есть рабочий скрапер на Requests и вы хотите запускать его параллельно, не переписывая сразу.
  • Выберите HTTPX , когда вам нужен API в стиле Requests с нативной поддержкой async.
  • Переходите к автоматизации браузера, когда целевому сайту нужны JavaScript, прокрутка, клики, формы, скриншоты или сохраняемое состояние браузера.

Начните с небольшого лимита параллельных запросов и проверьте полученные страницы, прежде чем его увеличивать.

Почему обычные запросы в Python работают медленно

Обычный скрипт на Requests синхронный. Он отправляет запрос, ждёт ответа и только затем переходит к следующему URL.

Этот пример не является частью асинхронного руководства. Он показывает традиционный подход с Requests, при котором URL загружаются по одному.

requests.get() отправляет один запрос. Цикл на не переходит к следующему URL, пока не придёт предыдущий ответ. Руководство по АЙО HTTP ниже меняет это поведение: несколько запросов выполняются одновременно.

Выберите подходящий подход в Python

Запросы подходит для разовой проверки, небольшого локального скрипта или короткого списка URL.

asyncio.to_thread() запускает существующий блокирующий код на Requests в потоках. Это даёт старому синхронному скраперу путь к параллельности без полного переписывания. В документации Python он рекомендуется в первую очередь для блокирующих I/O-операций, таких как HTTP-запросы.

АЙО HTTP является основной библиотекой в этом руководстве. Она построена на асинхронный, обрабатывает множество одновременных HTTP-запросов и использует переиспользуемую ClientSession с пулом соединений. В разделе aiohttp Client Quickstart не рекомендуется создавать новую сессию для каждого запроса.

HTTPX предлагает ещё один асинхронный вариант с API, похожим на Requests. Его документация по async и настройки лимитов ресурсов описывают переиспользуемые клиенты, ограничения на количество соединений и keep-alive-соединения.

браузер для скрапинга NodeMaven предназначен для сбора данных через браузер. Он запускает настоящий облачный браузер для страниц, которым нужны рендеринг JavaScript, прокрутка, клики, формы, скриншоты или сохранённые сессии браузера. Аккаунт NodeMaven по умолчанию может запускать до 50 активных сессий браузера одновременно.

Для более широкого знакомства с Requests, парсингом, селекторами и автоматизацией браузера прочитайте материал NodeMaven руководстве по веб-скрапингу на Python.

Запускайте браузерные сценарии без нагрузки на браузер

Когда асинхронные запросы не могут отрендерить страницу, начните пробный период прокси NodeMaven и запускайте до 50 облачных сессий браузера с помощью Scraping Browser. Браузер, профили и решатель CAPTCHA не требуют отдельной платы за браузер: начните с 750 MB резидентного и мобильного трафика за $3,50.

Попробовать сейчас

Пошагово: создаём асинхронный веб-скрапер на aiohttp

В этом руководстве используется Books to Scrape, сайт, созданный специально для практики скрапинга. В примере сначала загружается одна страница, затем несколько, а после добавляются ограничение параллельности и повторные попытки.

Шаг 1. Создайте виртуальное окружение и установите aiohttp

Откройте Terminal в папке, в которой хотите сохранить проект.

Создайте файл с именем async_scraper.py.

Шаг 2. Отправьте один асинхронный запрос

Начните с одной страницы. Так вы убедитесь, что окружение, соединение и код работают, прежде чем добавлять параллельность.

Запустите файл:

В терминале должно появиться начало HTML-кода страницы.

ClientSession() поддерживает пул соединений. Повторное использование одной и той же сессии позволяет скраперу переиспользовать соединения вместо того, чтобы открывать новое для каждой страницы.

Шаг 3. Загрузите несколько страниц с помощью asyncio.gather()

Замените код на версию, которая загружает несколько страниц категорий параллельно.

asyncio.gather() запускает задачи запросов одновременно и ждёт, пока все они завершатся. Для трёх URL это нормально, но для большого списка нужен лимит параллельности.

Шаг 4. Добавьте лимит параллелизма

Семафор ограничивает количество одновременно активных запросов. Скрапер по-прежнему может обработать большой список URL, но одновременно открытым остаётся только заданное число соединений.

Здесь у скрапера десять URL, но он открывает только пять запросов за раз. Начните с 3, 5 или 10. Увеличивайте число только после проверки качества ответов и доли ошибок.

Шаг 5. Добавьте повторные попытки и сохраните результаты в CSV

В финальной версии добавлены таймауты, экспоненциальная задержка при временных сбоях и вывод результатов в CSV-файл.

Запустите его снова:

Скрипт создаёт файл scrape_results.csv в той же папке. В рабочем скрапере замените html_length на поля, которые вы извлекаете из каждого ответа, например название товара, цену, наличие на складе, URL объявления или JSON-данные.

Протестируйте параллелизм перед масштабированием

Не считайте максимально возможное число одновременных запросов правильной настройкой. Надёжный скрапер отслеживает успешные, полные ответы, а не просто завершённые запросы.

Проверьте небольшую выборку URL при нескольких лимитах:

ПараллелизмЧто фиксировать
1Базовое время ответа и качество ответов
5Долю успешных запросов, ошибки 429 и таймауты
10Растёт ли число повторных попыток или блокировок
20+Возвращает ли целевой сайт по-прежнему полные и корректные страницы

Фиксируйте общее время выполнения, долю успешных запросов, повторные попытки, 403 и 429 ответы, таймауты и неполные страницы. Прекратите увеличивать число одновременных запросов, когда растёт доля ошибок или меняется возвращаемый контент.

Если после того, как вы нашли безопасную частоту запросов, рабочему процессу нужен больший охват, не стоит просто поднимать значение семафора. Для разрешённого сбора публичных данных ротационные резидентские прокси могут распределять независимые запросы по чистым IP. Для проверок по конкретному региону или многостраничных сценариев с файлами cookie и пагинацией используйте затяжные жилые сессии , чтобы скрапер сохранял одно постоянное местоположение на протяжении всей задачи.

Обсуждение на GitHub о большом объёме запросов через HTTPX показывает, как тысячи одновременных запросов могут приводить к проблемам с соединениями, если лимиты клиента и пул соединений настроены неаккуратно.

Масштабируйте асинхронные запросы с меньшим числом сбоев

Когда 429 появляются ошибки, нестабильные маршруты или ограничения на один IP, добавьте чистые резидентные прокси вместо дальнейшего повышения параллелизма. Протестируйте NodeMaven: 750 MB резидентного и мобильного трафика за $3,50 и держите каждый запрос на более надёжном маршруте

Попробовать сейчас

Альтернатива для существующих скриптов на requests: asyncio.to_thread()

Не обязательно переписывать рабочий скрапер на Requests в первый же день. asyncio.to_thread() может выполнять блокирующие функции Requests параллельно.

Это переходный подход, а не замена асинхронному HTTP-клиенту при больших масштабах. Скрапер, который уже опирается на Requests, может сначала получить параллельность, а затем перейти на АЙО HTTP или HTTPX, когда потребуется более точный контроль над соединениями и поведением запросов.

HTTPX AsyncClient: альтернатива в стиле Requests

HTTPX похож на Requests, но поддерживает нативные асинхронные запросы. Это естественный выбор, если ваша команда уже знакома с API Requests.

Используйте один общий AsyncClient на весь пакет запросов. Создание нового клиента внутри каждого запроса сводит на нет преимущества пула соединений. В одном обсуждении бенчмарков в сообществе HTTPXповторное использование клиента дало производительность, близкую к aiohttp, в тесте этого участника. Относитесь к этому как к примеру разработчика, а не как к универсальному бенчмарку.

Добавление прокси в асинхронные запросы Python

В небольших масштабах обычного подключения может быть достаточно. Повторяющиеся запросы с облачного сервера или с одного IP могут упираться в ограничения частоты запросов, несовпадение локации или проверки репутации IP.

Для независимых публичных страниц ротационные резидентские прокси могут распределять запросы по чистым IP-адресам реальных пользователей. А резидентский прокси с закреплённой сессией подходят для задачи, где в течение одного сеанса сбора нужны постоянная локация, файлы cookie или регион.

ISP прокси подходят для регулярного мониторинга, когда один и тот же стабильный IP должен сохраняться в течение долгого времени. Например, трекер цен, который проверяет фиксированный набор товаров каждые 15 минут, не должен случайным образом менять свою сетевую идентичность во время активного рабочего процесса.

HTTPX может отправлять запросы через прокси:

Для асинхронного кода передайте то же самое прокси значение в httpx.AsyncClient. NodeMaven’s прокси для Python описаны распространённые паттерны маршрутизации в Python, а руководство по аутентификации прокси объясняет учётные данные и методы аутентификации.

Собирайте данные только там, где доступ разрешён. Прокси не дают права получать доступ к приватным данным, обходить платный доступ или игнорировать правила сайта.

Когда асинхронные запросы не подходят

Асинхронные HTTP-запросы работают, когда целевой сайт возвращает данные в HTML или JSON. Они не могут взаимодействовать со страницей так, как это делает браузер.

Переходите к автоматизации браузера, когда рабочему процессу требуются:

  • Контент, отрисованный JavaScript
  • Прокрутка, клики или отправка форм
  • Скриншоты или визуальные проверки
  • Состояние входа в аккаунт и сохранённые файлы cookie
  • Профиль браузера, который сохраняется между запусками

браузер для скрапинга NodeMaven предоставляет облачный браузер с прокси NodeMaven, управляемыми настройками браузера, постоянными профилями, поддержкой CAPTCHA, отладкой Live Browser и записями сессий. У него есть отдельной платы за использование браузера для соответствующих требованиям клиентов NodeMaven. Вы платите за трафик прокси с ротацией, переданный во время сессий.

Для браузерных рабочих процессов с упором на код прочитайте руководство по скрапингу с Playwright. Для страниц, где рендеринг и визуальное взаимодействие не требуются, асинхронные HTTP-запросы обходятся легче.

Частые ошибки асинхронного скрапинга на Python

Создание новой сессии на каждый запрос: Создайте один aiohttp.ClientSession или httpx.AsyncClient на всю партию запросов. Это сохраняет пул соединений и избавляет от постоянного открытия новых подключений.

Запуск всех задач одновременно: asyncio.gather() не имеет встроенного ограничения частоты запросов. Добавьте семафор перед обработкой большого списка URL. Если разрешённому рабочему процессу после замедления всё ещё нужно больше независимых публичных запросов, ротационные резидентские прокси могут распределить запросы по чистым IP пользовательских сетей, а не концентрировать их на одном маршруте.

Повтор при любой ошибке: Повторяйте запросы при таймаутах, проблемах с соединением, ответах 429 и временных ошибках 5xx с экспоненциальной задержкой. Не повторяйте раз за разом ответы 400, 401, 403, или 404 , не меняя сам запрос. Ответ 403 может указывать на отсутствие прав, заблокированный маршрут или антибот-защиту. Материал NodeMaven руководство по ошибке 403 Forbidden объясняет, как диагностировать такие случаи.

Игнорирование тела ответа: A 200 OK ответ всё равно может содержать страницу с капчей, страницу входа, сообщение об отказе в доступе, пустой результат или неверный региональный контент. Проверяйте ожидаемый заголовок, поле JSON или маркер страницы, прежде чем сохранять результат. Чистые резидентские прокси также помогают снизить число капч и проверок в разрешённых рабочих процессах по сбору публичных данных, поскольку трафик идёт из диапазонов IP пользовательских сетей, а не с очевидной хостинговой инфраструктуры. Когда для набора данных нужна конкретная локация, резидентные прокси обеспечивают маршрутизацию на уровне страны, региона, города и ZIP-кода.

Смена локации прокси во время рабочего процесса с состоянием: Ротация подходит для независимых запросов. Если скрапер зависит от файлов cookie, локаций, пагинации или состояния аккаунта, сохраняйте одну стабильную сессию. Закреплённая резидентский прокси хорошо подходит для отдельного запуска сбора данных, а ISP прокси подходит для регулярного мониторинга с одного статического IP.

Восприятие проблем браузера как проблем HTTP: Если целевому сайту нужны JavaScript, прокрутка, клики или отправка форм, увеличение асинхронной конкурентности не покажет недостающий контент. браузер для скрапинга NodeMaven запускает реальные облачные сессии браузера с управляемыми прокси, постоянными профилями, поддержкой CAPTCHA и отладкой Live Browser, так что вы можете изучить отрендеренный процесс, а не гадать по HTTP-ответу.

Масштабируйте асинхронные запросы с меньшим числом сбоев

Когда 429 появляются ошибки, нестабильные маршруты или ограничения на один IP, добавьте чистые резидентные прокси вместо дальнейшего повышения параллелизма. Протестируйте NodeMaven: 750 MB резидентного и мобильного трафика за $3,50 и держите каждый запрос на более надёжном маршруте

Попробовать сейчас

Заключение

Создавайте асинхронный скрапер послойно. Начните с одного асинхронного запроса, затем добавьте конкурентные задачи, семафор, таймауты, повторные попытки и валидацию ответов.

Ключевая проверка: являются ли возвращённые страницы полными и корректными. Быстрый скрапер, который собирает страницы блокировок, неверные региональные результаты или пропускает записи, лишь добавляет работы по очистке данных.

Для HTML- и JSON-эндпоинтов АЙО HTTP или HTTPX могут эффективно выполнять высоконагруженные задачи. Если после установки безопасного лимита параллельности процент ошибок растёт, ротационные резидентские прокси могут распределять независимые публичные запросы по чистым IP. Используйте липкие резидентские прокси или ISP прокси , когда файлы cookie, геолокация, пагинация или регулярный мониторинг требуют стабильной сессии.

Когда целевому сайту нужны JavaScript, постоянное состояние браузера или интерактивное поведение страницы, переносите рабочий процесс в браузер для скрапинга NodeMaven. Он предоставляет управляемые облачные браузеры, маршрутизацию через прокси, поддержку CAPTCHA, постоянные профили и отладку Live Browser, а также отдельной платы за использование браузера помимо прокси-трафика, переданного в течение каждой сессии.

FAQ

Асинхронные запросы в Python — это HTTP-запросы, выполняемые асинхронным кодом. Пока один запрос ждёт ответа сервера, цикл событий может запустить или продолжить другой запрос.

АЙО HTTP обрабатывает множество одновременных HTTP-запросов в одном асинхронном цикле событий. Requests проще для небольших синхронных скриптов. Правильный выбор зависит от объёма запросов, поведения целевого сайта и того, насколько тонкий контроль над соединениями нужен скраперу.

У HTTPX API в стиле Requests, нативная поддержка async, поддержка HTTP/2 и настраиваемые лимиты соединений. aiohttp предлагает зрелые клиентские возможности, ориентированные на asyncio, и прямой контроль над сессиями и соединениями. Протестируйте оба варианта на своём целевом сайте и с собственными правилами валидации ответов.

Начните с низкой конкурентности, добавьте семафор, соблюдайте Retry-After , где они доступны, повторяйте запросы с экспоненциальной задержкой и проверяйте ответы. Когда повторяющиеся публичные запросы ограничиваются по одному IP, направляйте разрешённые рабочие процессы через чистые жилые прокси , а не отправляйте каждый запрос по одному маршруту.

Для небольшого теста не нужны. Прокси требуются, когда скраперу нужны региональные ответы, повторяющиеся публичные запросы, стабильная долгоживущая идентичность или более надёжный маршрут из облачной инфраструктуры.

Нет. АЙО HTTP загружает ответ сервера, но не выполняет JavaScript на странице. Используйте Playwright, Selenium или браузер для скрапинга NodeMaven , когда контент появляется только после рендеринга или взаимодействия со страницей.

Вам также могут понравиться эти статьи

Этот сайт использует Файлы cookie чтобы улучшить ваш опыт. Продолжая, вы соглашаетесь на использование файлов cookie.