Веб-скрейпинг: перехват XHR-запросов

Веб-скрейпинг: перехват XHR-запросов

В этой статье я покажу, как перехватывать эти XHR-запросы и извлекать нужные данные. Мы разберем, почему этот подход так хорошо работает и как использовать Python и Playwright, чтобы реализовать это на практике. Независимо от того, новичок ли вы в Веб-скрейпинг и автоматизация: или если вы ищете более продвинутые техники, это руководство вам поможет. Давайте начнем!

Что такое XHR?

XMLHttpRequest (XHR) это функция браузера, которая позволяет веб-страницам асинхронно получать данные без перезагрузки страницы. Это позволяет сайтам динамически обновлять контент, делая их более интерактивными. Например, когда вы прокручиваете ленту Twitter или обновляете ленту новостей, страница не перезагружается, а новый контент загружается в фоновом режиме с помощью XHR.

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

Почему стоит использовать XHR-запросы для веб-скрапинга?

  1. Efficiency: Сайты, которые динамически загружают данные через XHR, обычно передают структурированные данные в Формат JSON или XML. Такие форматы гораздо проще обрабатывать, чем HTML, для которого может потребоваться сложный парсинг.
  2. Fewer Changes: В отличие от HTML-элементов и CSS-селекторы, который может часто меняться из-за редизайнов или обновлений, тогда как конечные точки API, используемые для XHR-запросов, обычно гораздо стабильнее с течением времени.
  3. Avoiding HTML Parsing: Поскольку данные уже структурированы, нет необходимости разбирать HTML-контент и использовать сложные CSS-селекторы, чтобы извлечь нужную информацию. Это особенно полезно для сайтов со сложными или вложенными HTML-структурами.
  4. Reduced Bandwidth: By focusing only on the relevant XHR requests (e.g., JSON endpoints), you can avoid loading unnecessary resources like images, stylesheets, and ads, which saves bandwidth and speeds up the scraping process.

Как перехватывать XHR-запросы

Чтобы извлекать данные из XHR-запросов, вам понадобится инструмент, который умеет взаимодействовать с веб-страницами, выполнять JavaScript и анализировать сетевой трафик. Два популярных инструмента для этого - Puppeteer и Playwright. В этом руководстве мы будем использовать Playwright вместе с Python, чтобы перехватывать XHR-запросы.

Пререквизиты

Перед началом убедитесь, что у вас есть следующее:

  1. Python 3.x должны быть установлены на вашем компьютере.
  2. Драматург установлен, что позволит вам взаимодействовать с веб-браузерами.
  3. Бинарные файлы браузера (Chromium, Firefox или WebKit) для Playwright.

Установить Playwright можно, выполнив следующие команды в терминале:

pip install playwright
установить playwright

После установки Playwright можно приступать к работе.

Example 1: Scraping Auction.com

Let’s start by scraping auction.com, which displays auction listings of properties. The website loads its content dynamically using XHR requests. Instead of scraping the HTML directly, we will intercept the XHR requests to get the data we need.

с сайта playwright.sync_api импорт sync_playwright
url = "https://www.auction.com/residential/ca/"
с sync_playwright() в роли p:
browser = p.chromium.launch()
page = browser.new_page()
# Intercepting the XHR requests
def handle_response(ответ):
если "v1/search/assets?" в response.url:
печать(response.json()["result"]["assets"]["asset"])
page.on("response", handle_response)
# Go to the page and wait for it to load
page.goto(url, wait_until="networkidle", timeout=90000)
page.context.close()
browser.close()

Разбор кода:

  • playwright.sync_api.sync_playwright(): Launches a headless browser session.
  • browser.new_page(): Открывает новую страницу (или вкладку) в браузере.
  • page.on(“response”, handle_response): Registers a listener to intercept all network responses.
  • response.url: Checks the URL of the intercepted XHR request to find the one that contains the data we need.
  • response.json(): Extracts the JSON data from the XHR response and prints it.

В этом примере нужные данные загружаются с эндпоинта, в URL которого есть строка "v1/search/assets?". Отфильтровав по этой строке, мы получаем JSON-ответ с данными аукциона, такими как адрес объекта, цена и многое другое.

Example 2: Scraping Twitter.com

Twitter (или X) также использует XHR-запросы для загрузки твитов, подписчиков и других динамических данных. Мы можем использовать Playwright, чтобы перехватывать эти запросы и извлекать JSON-данные, которые более структурированы и проще для разбора, чем HTML.

импорт json
с сайта playwright.sync_api импорт sync_playwright
url = "https://twitter.com/playwrightweb/status/1396888644019884033"
с sync_playwright() в роли p:
def handle_response(ответ):
если "/TweetDetail?" в response.url:
печать(json.dumps(response.json()))
browser = p.chromium.launch()
page = browser.new_page()
page.on("response", handle_response)
page.goto(url, wait_until="networkidle")
page.context.close()
browser.close()

В данном случае нас интересует эндпоинт "/TweetDetail?". После перехвата XHR-запроса мы можем извлечь подробную информацию о твите, такую как текст твита, данные пользователя, ретвиты и лайки.

Пример 3: сбор данных с NSE India

Сайт Национальная фондовая биржа Индии (NSE) Также XHR-запросы используются для загрузки данных фондового рынка в реальном времени. Вместо прямого сбора данных со страницы мы можем перехватывать эти запросы, чтобы получать данные более эффективно.

с сайта playwright.sync_api import sync_playwright
url = "https://www.nseindia.com/market-data/live-equity-market"
с sync_playwright() в роли p:
def handle_response(ответ):
если "equity-stockIndices?" в response.url:
items = response.json()["data"]
[print(item["symbol"], item["lastPrice"]) для пункт в items]
browser = p.chromium.launch()
page = browser.new_page()
page.на("response", handle_response)
page.перейти по ссылке(url, wait_until="networkidle")
page.context.close()
browser.close()

Здесь нужные нам данные доступны в JSON-ответе эндпоинта equity-stockIndices?. Код перебирает элементы и выводит тикеры акций и их последние цены.

Избегайте блокировок при перехвате XHR-запросов с помощью Bright Data Web Unlocker

Некоторые сайты используют антибот-защиту, которая может заблокировать вашему скраперу доступ к данным XHR. Такая защита включает CAPTCHA, блокировки по IP и JavaScript-проверки, из-за чего надежно извлекать данные становится сложно. Вместо ручной обработки этих проблем вы можете использовать Web Unlocker от Bright Data, который автоматически обходит эти ограничения и обеспечивает высокий процент успешного сбора XHR-запросов.

Почему стоит использовать Web Unlocker для скрапинга XHR-запросов?

✅ Обходит CAPTCHA и защиту от ботов: ручное вмешательство не требуется
✅ Обрабатывает заголовки, cookies и рендеринг JavaScript — обеспечивает бесперебойный сбор данных
✅ Не нужна ручная ротация прокси. Без проблем работает с любым целевым сайтом

Пример: использование Web Unlocker с Playwright на Python

импорт requests

proxy = "http://username:[email protected]:22225"
url = "https://example.com"

response = requests.get(url, proxies={"http": прокси, "https": proxy})
печать(response.text)

🔹 Как это работает:

  • Пропускает запросы через Bright Data Web Unlocker, обходя антибот-защиту
  • Автоматически обрабатывает заголовки, cookies и JavaScript-проверки
  • Обеспечивает стабильный доступ к XHR-данным без блокировок по IP

Лучшие практики при перехвате XHR-запросов

  1. Handle Dynamic Content: When scraping dynamic websites that use XHR, it’s essential to understand the timing of the page load. Use wait_until=”networkidle” to ensure the page is fully loaded before scraping, or use wait_for_selector to wait for a specific element to appear.
  2. Monitor API Endpoints: Используйте инструменты разработчика браузера, чтобы отслеживать сетевой трафик и определять, какие XHR-запросы содержат нужные вам данные. Ищите запросы, которые возвращают данные в формате JSON или XML, поскольку их обычно проще разбирать.
  3. Respect Robots.txt: Before scraping any website, make sure to check its robots.txt file to ensure that scraping is allowed. Respect the website’s rules and avoid overloading its servers with too many requests.
  4. Используйте прокси и избегайте блокировок по IP: Некоторые сайты могут заблокировать ваш IP-адрес, если вы отправляете слишком много запросов за короткий промежуток времени. Чтобы избежать этого, используйте прокси, чтобы распределять запросы и избегать обнаружения.
  5. Error Handling: Обрабатывайте потенциальные ошибки в коде, такие как тайм-ауты или отсутствие данных, чтобы сделать ваш скрейпер более устойчивым. Можно реализовать повторные попытки или использовать резервные механизмы, чтобы скрейпер продолжал работать без сбоев.

Заключение

Перехват XHR-запросов для веб-скрапинга - эффективный и практичный способ собирать структурированные данные с динамических сайтов. Сосредоточившись на конечных точках API вместо парсинга HTML, вы сможете сэкономить время, трафик и усилия при скрапинге. Playwright - мощный инструмент, который упрощает этот процесс, и примеры из этой статьи должны дать вам прочную основу, чтобы начать использовать перехват XHR-запросов в своих проектах.

Помните: всегда следуйте лучшим практикам, уважайте сайты, с которых вы собираете данные, и корректно обрабатывайте возможные проблемы вроде блокировок по IP и ошибок. При правильном подходе XHR-скрейпинг может стать мощным инструментом в вашем инструментарии для веб-скрейпинга!

Похожие записи