Вебскрапінг: перехоплення XHR-запитів
У цій статті я покажу вам, як перехоплювати ці XHR-запити та отримувати потрібні вам дані. Ми розберемося, чому цей підхід так добре працює і як ви можете використати Python і Playwright, щоб це реалізувати. Якщо ви лише починаєте вебскрапінг або якщо шукаєте більш просунуті техніки, цей посібник вам підійде. Почнімо!
Що таке XHR?
XMLHttpRequest (XHR) це функція браузера, яка дає вебсторінкам змогу асинхронно отримувати дані без перезавантаження сторінки. Це дозволяє сайтам динамічно оновлювати контент, роблячи їх інтерактивнішими. Наприклад, коли ви прокручуєте стрічку Twitter або оновлюєте стрічку новин, сторінка не перезавантажується, але новий контент у фоновому режимі завантажується за допомогою XHR.
Це корисно для вебскрапінгу, оскільки замість того, щоб збирати дані безпосередньо з HTML-розмітки сторінки (яка може бути неповною або застарілою), ми можемо перехоплювати запити, які сторінка виконує, щоб отримати необроблені дані, що завантажуються у фоновому режимі.
Навіщо використовувати XHR-запити для вебскрапінгу?
- Efficiency: Вебсайти, що динамічно завантажують дані через XHR, зазвичай надсилають структуровані дані в формат JSON або XML. Ці формати значно зручніші для роботи, ніж HTML, який може вимагати складного парсингу.
- Fewer Changes: На відміну від HTML-елементів і CSS-селектори, які можуть часто змінюватися через редизайн або оновлення, API-ендпоїнти, що використовуються для XHR-запитів, зазвичай стабільніші з часом.
- Avoiding HTML Parsing: Оскільки дані вже структуровані, немає потреби парсити HTML-вміст і використовувати складні CSS-селектори, щоб витягти потрібну інформацію. Це особливо корисно для сайтів зі складною або вкладеною HTML-структурою.
- 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-запити.
Prerequisites
Перед початком переконайтеся, що у вас є таке:
- Python 3.x встановлено на вашому комп’ютері.
- Playwright встановлено, що дасть змогу взаємодіяти з веббраузерами.
- Бінарні файли браузера (Chromium, Firefox або WebKit) для Playwright.
Ви можете встановити Playwright, виконавши такі команди в терміналі:
pip install playwright
playwright install
Після встановлення 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.
from playwright.sync_api import sync_playwright
url = "https://www.auction.com/residential/ca/"
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
# Intercepting the XHR requests
def handle_response(response):
if "v1/search/assets?" in response.url:
print(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.
import json
from playwright.sync_api import sync_playwright
url = "https://twitter.com/playwrightweb/status/1396888644019884033"
with sync_playwright() as p:
def handle_response(response):
if "/TweetDetail?" in response.url:
print(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
The Національна фондова біржа Індії (NSE) також використовує XHR-запити для завантаження даних фондового ринку в реальному часі. Замість того щоб скрапити сторінку безпосередньо, ми можемо перехоплювати ці запити, щоб отримувати дані ефективніше.
from playwright.sync_api import sync_playwright
url = "https://www.nseindia.com/market-data/live-equity-market"
with sync_playwright() as p:
def handle_response(response):
if "equity-stockIndices?" in response.url:
items = response.json()["data"]
[print(item["symbol"], item["lastPrice"]) for item in items]
browser = p.chromium.launch()
page = browser.new_page()
page.on("response", handle_response)
page.goto(url, wait_until="networkidle")
page.context.close()
browser.close()
Тут потрібні нам дані доступні у JSON-відповіді з кінцевої точки `equity-stockIndices?`. Код проходить по елементах і виводить біржові символи акцій та їхні останні ціни.
Уникайте блокувань під час вебскрапінгу XHR-запитів за допомогою Bright Data’s Web Unlocker
Деякі вебсайти впроваджують антибот-захист, який може заблокувати ваш вебскрапер від доступу до XHR-даних. До таких захистів належать CAPTCHA, блокування IP і JavaScript-челенджі, через що надійно витягувати дані стає складно. Замість того щоб вручну розв’язувати ці проблеми, ви можете використати Web Unlocker від Bright Data, що автоматично обходить ці обмеження та забезпечує високий відсоток успіху під час вебскрапінгу XHR-запитів.
Навіщо використовувати Web Unlocker для XHR-вебскрапінгу?
✅ Обходить CAPTCHA та захист від ботів — без ручного розв’язання
✅ Підтримує заголовки, cookie-файли та рендеринг JavaScript — забезпечує безперебійний вебскрапінг
✅ Немає потреби в ручній ротації проксі — без проблем працює з будь-яким цільовим вебсайтом
Приклад: використання Web Unlocker із Playwright у Python
import requests
proxy = "http://username:[email protected]:22225"
url = "https://example.com"
response = requests.get(url, proxies={"http": проксі, "https": proxy})
print(response.text)
🔹 Як це працює:
- Маршрутизує запити через Web Unlocker від Bright Data, обходячи антибот-захист
- Автоматично керує заголовками, файлами cookie та JavaScript-перевірками
- Забезпечує стабільний доступ до даних XHR без IP-блокувань
Найкращі практики для вебскрапінгу XHR-запитів
- 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.
- Monitor API Endpoints: Використовуйте інструменти розробника у вашому браузері, щоб відстежувати мережевий трафік і визначати, які XHR-запити містять потрібні вам дані. Шукайте запити, що повертають дані у форматі JSON або XML, оскільки їх зазвичай простіше парсити.
- 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.
- Використовуйте проксі та уникайте IP-блокувань: Деякі вебсайти можуть заблокувати вашу IP-адресу, якщо ви надсилатимете забагато запитів за короткий проміжок часу. Щоб цього уникнути, використовуйте проксі, щоб розподіляти запити та уникати виявлення.
- Error Handling: Обробляйте потенційні помилки у своєму коді, такі як тайм-аути або відсутні дані, щоб зробити ваш вебскрапер стійкішим. Ви можете реалізувати повторні спроби або використовувати резервні механізми, щоб ваш вебскрапер продовжував працювати безперебійно.
Conclusion
Перехоплення XHR-запитів для вебскрапінгу є ефективним і результативним способом збирання структурованих даних із динамічних вебсайтів. Зосереджуючись на API-ендпоінтах, а не на вебскрапінгу HTML, ви можете заощадити час, трафік і зусилля під час своїх завдань зі скрапінгу. Playwright — це потужний інструмент, який спрощує цей процес, а з прикладами, наведеними в цій статті, ви матимете надійну базу, щоб почати працювати з перехопленням XHR-запитів у своїх проєктах.
Пам’ятайте завжди дотримуватися найкращих практик, поважати вебсайти, які ви вебскрапите, і коректно обробляти потенційні проблеми, як-от IP-блокування та помилки. За правильного підходу вебскрапінг XHR може стати потужним інструментом у вашому наборі інструментів для вебскрапінгу!

