如何通过拦截 XHR 请求进行网络抓取
在本文中,我将向你展示如何拦截这些 XHR 请求并获取所需的数据。我们将深入探讨为什么这种方法如此有效,以及如何使用 Python 和 Playwright 来实现它。无论你是 网络抓取 或寻找更高级的技巧,本指南将为您一一解答。让我们开始吧
什么是 XHR?
XMLHttpRequest (XHR) 是一种浏览器功能,允许网页异步获取数据而无需重新加载页面。这使得网站可以动态更新内容,使其更具互动性。例如,当你滚动浏览 Twitter feed 或刷新新闻源时,页面不会重新加载,而是在后台使用 XHR 获取新内容。
这对网络搜刮非常有用,因为我们可以拦截页面发出的请求,获取后台获取的原始数据,而不是直接从页面的 HTML 中搜刮数据(这些数据可能不完整或过时)。
为什么使用 XHR 请求进行网络抓取?
- 效率: 通过 XHR 动态加载数据的网站通常以 JSON 或 XML 格式.与可能需要复杂解析的 HTML 相比,这些格式更容易操作。
- 变化更少: 与 HTML 元素和 CSS 选择器而用于 XHR 请求的 API 端点通常随着时间的推移更加稳定。
- 避免 HTML 解析 由于数据已经结构化,因此无需解析 HTML 内容和使用复杂的 CSS 选择器来提取所需的信息。这对于具有复杂或嵌套 HTML 结构的网站尤其有用。
- 减少带宽: 通过只关注相关的 XHR 请求(如 JSON 端点),可以避免加载不必要的资源,如图片、样式表和广告,从而节省带宽并加快刮擦过程。
如何拦截 XHR 请求
要抓取 XHR 请求,你需要一个能与网页交互、执行 JavaScript 和检查网络流量的工具。两个常用的工具是 Puppeteer 和 Playwright。在本指南中,我们将使用 Playwright 和 Python 来拦截 XHR 请求。
先决条件
在开始之前,请确保您具备以下条件:
- Python 3.x 安装在您的电脑上。
- Playwright 安装后,就可以与网络浏览器进行交互。
- 浏览器二进制文件 (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 抓取?
✅ 绕过验证码和机器人保护--无需手动解码
✅ 处理页眉、Cookie 和 JavaScript 渲染 - 确保顺利抓取
✅ 无需手动轮换代理 - 可与任何目标网站无缝连接
示例:在 Python 中使用网络解锁器和 Playwright
import 要求
代理 = "http://username:[email protected]:22225"
url = "https://example.com"
response = requests.get(url, proxies={"http": proxy, "https": proxy})
print(response.text)
🔹它是如何工作的:
- 通过 Bright Data 的网络解锁程序路由请求,绕过反僵尸保护程序
- 自动管理标头、cookie 和 JavaScript 挑战
- 确保对 XHR 数据的一致访问,无 IP 禁止
抓取 XHR 请求的最佳实践
- 处理动态内容 在刮擦使用 XHR 的动态网站时,必须了解页面加载的时间。使用 wait_until="networkidle "确保页面在搜刮前完全加载,或使用 wait_for_selector 等待特定元素出现。
- 监控 API 端点: 使用浏览器的 "开发工具 "监控网络流量,确定哪些 XHR 请求包含您需要的数据。查找以 JSON 或 XML 格式返回数据的请求,因为这些格式通常更容易解析。
- 尊重 Robots.txt: 在刮擦任何网站之前,请务必检查其 robots.txt 文件,确保允许刮擦。尊重网站的规则,避免过多的请求使其服务器超负荷。
- 使用代理服务器,避免 IP 堵塞: 如果您在短时间内请求过多,某些网站可能会屏蔽您的 IP。 为了避免这种情况使用代理分发请求,避免被发现。
- 错误处理: 处理代码中的潜在错误,如超时或数据丢失,使您的刮擦器更具弹性。您可以实施重试或使用后备机制,以确保您的刮擦程序继续顺利运行。
结论
拦截 XHR 请求进行网络搜刮是一种从动态网站收集结构化数据的有效方法。通过专注于 API 端点而不是刮擦 HTML,您可以在刮擦任务中节省时间、带宽和精力。Playwright 是简化这一过程的强大工具,通过本文提供的示例,您应该已经为开始使用 XHR 请求为您的项目服务打下了坚实的基础。
切记要始终遵循最佳实践,尊重你正在搜刮的网站,并从容应对 IP 屏蔽和错误等潜在问题。只要方法得当,XHR 搜刮就能成为你网络搜刮工具包中的强大工具!