如何通过拦截 XHR 请求进行网络抓取

如何通过拦截 XHR 请求进行网络抓取

在本文中,我将向你展示如何拦截这些 XHR 请求并获取所需的数据。我们将深入探讨为什么这种方法如此有效,以及如何使用 Python 和 Playwright 来实现它。无论你是 网络抓取 或寻找更高级的技巧,本指南将为您一一解答。让我们开始吧

什么是 XHR?

XMLHttpRequest(XHR) 是一种浏览器功能,允许网页异步获取数据而无需重新加载页面。这使得网站可以动态更新内容,使其更具互动性。例如,当你滚动浏览 Twitter feed 或刷新新闻源时,页面不会重新加载,而是在后台使用 XHR 获取新内容。

这对于网络爬虫很有用,因为我们可以拦截页面发出的请求,获取后台抓取的原始数据,而不是直接从页面的 HTML 中抓取数据(这些数据可能不完整或已过时)。

为什么使用 XHR 请求进行网络抓取?

  1. 效率: 通过 XHR 动态加载数据的网站通常以 JSON 或 XML 格式.与可能需要复杂解析的 HTML 相比,这些格式更容易操作。
  2. 变化更少: 与 HTML 元素和 CSS 选择器而用于 XHR 请求的 API 端点通常随着时间的推移更加稳定。
  3. 避免 HTML 解析 由于数据已经结构化,因此无需解析 HTML 内容和使用复杂的 CSS 选择器来提取所需的信息。这对于具有复杂或嵌套 HTML 结构的网站尤其有用。
  4. 减少带宽: 通过只关注相关的 XHR 请求(如 JSON 端点),可以避免加载不必要的资源,如图片、样式表和广告,从而节省带宽并加快刮擦过程。

如何拦截 XHR 请求

要爬取 XHR 请求,您需要一个能够与网页交互、执行 JavaScript 并检查网络流量的工具。两个常用的工具是 Puppeteer 和 Playwright。本指南中,我们将使用 Python 版 Playwright 来拦截 XHR 请求。

先决条件

在开始之前,请确保您具备以下条件:

  1. Python 3.x 安装在您的电脑上。
  2. Playwright 安装后,就可以与网络浏览器进行交互。
  3. 浏览器二进制文件 (Chromium、Firefox 或 WebKit) 用于 Playwright。

在终端运行以下命令即可安装 Playwright:

pip install playwright
安装

安装完 Playwright 后,您就可以开始了。

示例 1:搜索 Auction.com

让我们从显示房产拍卖列表的 auction.com 开始刮擦。该网站使用 XHR 请求动态加载内容。我们将截取 XHR 请求以获取所需数据,而不是直接抓取 HTML。

from playwright.sync_api import 同步播放器
url = "https://www.auction.com/residential/ca/"
with sync_playwright() as p:
浏览器 = p.chromium.launch()
page = browser.new_page()
# 拦截 XHR 请求
def 处理响应(response):
if "v1/search/assets?" in response.url:
print(response.json()["结果"]["资产"]["资产"])
page.on("响应", handle_response)
# 转到页面,等待加载
page.goto(url, wait_until="networkidle", timeout=90000)
page.context.close()
browser.close()

代码分解:

  • playwright.sync_api.sync_playwright():启动无头浏览器会话。
  • browser.new_page():在浏览器中打开一个新页面(或标签页)。
  • page.on("response", handle_response):注册一个监听器以拦截所有网络响应。
  • response.url:检查截获的 XHR 请求的 URL,找到包含我们需要的数据的 URL。
  • response.json():从 XHR 响应中提取 JSON 数据并打印出来。

在本例中,相关数据是从 URL 中包含 v1/search/assets? 的端点获取的。通过对该字符串进行过滤,我们捕获了包含拍卖数据(如房产地址、价格等)的 JSON 响应。

示例 2:搜索 Twitter.com

Twitter(或 X)也使用 XHR 请求来加载推文、关注者和其他动态数据。我们可以使用 Playwright 来拦截这些请求并提取 JSON 数据,因为 JSON 数据比 HTML 更有条理,也更容易解析。

import json
from playwright.sync_api import 同步播放器
url = "https://twitter.com/playwrightweb/status/1396888644019884033"
with sync_playwright() as p:
def 处理响应(response):
if "/TweetDetail?" in response.url:
print(json.dumps(response.json()))
浏览器 = p.chromium.launch()
page = browser.new_page()
page.on("响应", handle_response)
page.goto(url, wait_until="networkidle")
page.context.close()
browser.close()

在本例中,我们感兴趣的端点是"/TweetDetail?"。截获 XHR 请求后,我们就可以提取推文的详细信息,如推文文本、用户信息、转发和点赞。

示例 3:搜索印度 NSE 指数

"(《世界人权宣言》) 印度国家证券交易所 也使用 XHR 请求加载实时股票市场数据。我们可以拦截这些请求,从而更高效地获取数据,而不是直接刮擦页面。

from playwright.sync_api 导入 sync_playwright
url = "https://www.nseindia.com/market-data/live-equity-market"
with sync_playwright() as p:
def 处理响应(response):
if "股票指数"? in response.url:
项目 = response.json()["data"]
[print(item["符号"], item["最后价格"]) for item in 项目]
浏览器 = p.chromium.launch()
页面 = browser.new_page()
页面on("响应", handle_response)
页面。goto(url, wait_until="networkidle")
page.context.close()
browser.close()

在这里,我们需要的数据可从股票股价指数(equity-stockIndices?)端点的 JSON 响应中获得。代码会循环查看这些项目,并打印出股票代码及其最后价格。

使用 Bright Data 的 Web 解锁器避免在抓取 XHR 请求时出现阻塞

有些网站实施了反僵尸保护措施,可以阻止你的刮擦程序访问 XHR 数据。这些保护措施包括验证码、IP 禁止和 JavaScript 挑战,从而导致难以可靠地提取数据。您可以使用 Bright Data 的网络解锁程序,可自动绕过这些限制,并确保高成功率的 XHR 请求。

为什么使用 Web Unlocker 进行 XHR 抓取?

✅ 绕过验证码和机器人保护--无需手动解码
✅ 处理请求头、Cookies 和 JavaScript 渲染——确保抓取顺畅
✅ 无需手动轮换代理 - 可与任何目标网站无缝连接

示例:在 Python 中将 Web Unlocker 与 Playwright 结合使用

import 要求

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

response = requests.get(url, proxies={"http": 代理, "https": proxy})
print(response.text)

🔹它是如何工作的:

  • 通过 Bright Data 的网络解锁程序路由请求,绕过反僵尸保护程序
  • 自动处理请求头、Cookies 和 JavaScript 验证挑战
  • 确保对 XHR 数据的一致访问,无 IP 禁止

抓取 XHR 请求的最佳实践

  1. 处理动态内容 在刮擦使用 XHR 的动态网站时,必须了解页面加载的时间。使用 wait_until="networkidle "确保页面在搜刮前完全加载,或使用 wait_for_selector 等待特定元素出现。
  2. 监控 API 端点: 使用浏览器的 "开发工具 "监控网络流量,确定哪些 XHR 请求包含您需要的数据。查找以 JSON 或 XML 格式返回数据的请求,因为这些格式通常更容易解析。
  3. 尊重 Robots.txt: 在刮擦任何网站之前,请务必检查其 robots.txt 文件,确保允许刮擦。尊重网站的规则,避免过多的请求使其服务器超负荷。
  4. 使用代理服务器,避免 IP 堵塞: 如果您在短时间内请求过多,某些网站可能会屏蔽您的 IP。 为了避免这种情况使用代理分发请求,避免被发现。
  5. 错误处理: 处理代码中的潜在错误,如超时或数据丢失,使您的刮擦器更具弹性。您可以实施重试或使用后备机制,以确保您的刮擦程序继续顺利运行。

结论

在网页抓取中拦截 XHR 请求,是从动态网站收集结构化数据的一种高效方法。通过关注 API 端点而不是抓取 HTML,你可以在抓取任务中节省时间、带宽和精力。Playwright 是一款强大的工具,可以简化这一流程;结合本文提供的示例,你应该已经具备了开始在项目中抓取 XHR 请求的扎实基础。

请始终遵循最佳实践,尊重你正在抓取的网站,并妥善处理 IP 封禁和错误等潜在问题。方法得当的话,XHR 抓取可以成为你网页抓取工具箱中的一个强大工具!

类似文章