Ajax网络爬虫:完整指南

作者 :

反应 :

评论

抓取一个使用 AJAX 比传统的网页抓取更为复杂。内容并不在 HTML 初始:事后才出现,通过 JavaScript. 因此,普通的网页抓取工具无法获取这些数据,必须采用适当的方法来提取这些动态数据。.

在使用AJAX通过JavaScript加载数据的网站上,网络爬虫的工作原理
在使用AJAX的网站上进行网页抓取的原理。©Christina 供Alucare.fr使用

AJAX 与网络爬虫:两者有何不同?

这 网络搜刮 就是分析代码 HTML 从网页中自动提取有用数据。在静态网站上,该功能运行非常顺畅。问题出现在 AJAX (用于 Asynchronous JavaScript and XML),一种用于加载或更新内容的技术 无需重新加载整个页面.

AJAX 是如何工作的?

浏览器(或 浏览器) 发送一些小 异步请求 发送到后台服务器。服务器返回数据,通常采用 JSON. 随后,页面会即时显示这些信息,而无需重新加载其余内容。这正是让网页运行得更快、交互性更强的关键。.

AJAX的工作原理示意图:它在后台加载数据,而无需重新加载整个网页
在使用AJAX的网站上进行网页抓取的原理。©Christina 供Alucare.fr使用

为什么AJAX爬取更复杂?

当一个网站使用 AJAX, ,加载的内容未显示在 初始HTML源代码. 它是由……事后注入的 JavaScript, ,页面打开后。传统的网页抓取工具只能提取 静态内容 : 因此他看不到那些 动态数据 随后添加。.

要获取这些数据,你需要一个能够运行 JavaScript 的工具。实际上,主要有三种方法:

  • 直接复制 AJAX请求, ,即通话 XHR 负责加载数据。.
  • 驾驶一辆 无头浏览器 作为 Selenium 在哪里 Playwright, ,负责渲染(或 渲染) 像真正的浏览器一样浏览该页面。.
  • 通过一个 扫描应用程序接口 一体化。.

AJAX抓取有哪些方法和工具?

方法 1:重现 AJAX 请求

这是最有效的方法,用于 获取动态数据. 与其渲染整个页面,不如你 拦截AJAX请求 发送至服务器,然后直接复制这些数据以获取原始数据,通常以 JSON.

要查找这些调用,请打开浏览器的开发者工具,然后进入 网络 带过滤器 XHR. 你将在其中看到端点的确切URL,以及 标头 以及回复的格式。.

该技术的优势:

  • 速度极快且轻便, ,因为它无需对页面进行完整渲染。.
  • 她 绕过问题 与JavaScript渲染相关的。.

其局限性:

  • 更多的 实施起来比较复杂 而非无头浏览器。.
  • 她要求一个 细致分析 请求、请求头和参数。某些网站要求必须提供令牌或特定的请求头。.

在库方面,你可以根据编程语言进行选择:

用于重现AJAX请求的requests(Python)和axios(JavaScript)库
Python 和 JavaScript 提供了两个用于实现 AJAX 请求的库:requests 和 axios。©Christina 供 Alucare.fr 使用

方法 2:使用无界面浏览器

这是最简单的方法。 抓取动态网页. 你可以自动化操作一个没有图形界面的真实网页浏览器。它会像用户一样精确地呈现网页,并执行 JavaScript, ,触发AJAX请求并显示最终内容。.

优点 :

  • 你刮得一模一样 用户所见的内容, ,包括已加载的内容。.
  • 这是 易于实施, ,即使是在一个动态性很强的网站上也是如此。.

不方便之处:

  • 这是 较慢 比直接请求更…….
  • 这是 资源消耗大, ,因为你会启动一个完整的浏览器。.

该方法最常用的工具包括:

  • Selenium :一款功能多样、历史悠久且文档完善的工具。.
  • Playwright :现代化、快速且支持多种浏览器。.
  • Puppeteer : 专门用于 Chrome 和 Chromium.

Puppeteer、Playwright 和 Selenium 这三种无头浏览器的对比分析:用于抓取 AJAX 页面
Puppeteer、Playwright 和 Selenium 可对无头浏览器进行自动化操作,以抓取动态网页。©Christina 供 Alucare.fr 使用

你可以将无头浏览器与 BeautifulSoup (模块 bs4) :浏览器加载页面并确保 渲染 JavaScript,然后你 parses 使用该库生成的HTML。.

方法3:一体化爬虫API

某些平台提供 全方位的网页抓取服务其中 免费工具 或市场上的付费服务。例如: Bright Data, ZenRows, ScrapingBee 在哪里 Crawlbase. 它们会自动管理 JavaScript 渲染, 他们 代理 以及数据提取 :你发送一个URL,它们就会将最终内容发回给你。.

优点 :

  • 简单可靠, ,即使是大规模的。.
  • 你这边无需管理任何基础设施或代理服务器。.

不方便之处:

  • 这 成本可能较高 视数量而定。.
  • 你有 较少的控制 关于该过程。.

Bright Data 接口——一款面向 AJAX 网站的一站式爬虫 API
Bright Data 是一款集多功能于一体的爬虫 API,支持 JavaScript 渲染和代理管理。©Christina 供 Alucare.fr 使用

如何抓取使用AJAX的网站?

以下是具体如何抓取一个通过 AJAX, ,其中包含两个代码示例,语言为 Python : 一个带 requests, ,一个带有 无头浏览器.

1. 在开发工具中识别 AJAX 请求

通过AJAX加载的内容不在 原始HTML. 因此,需要定位那个用于获取数据的网络调用。.

  • 打开这些 开发工具 在你的浏览器中(按 F12 或右键单击,然后选择“检查”)。.
  • 转到该选项卡 网络 (Network) 然后刷新页面。.
  • 观察它们 由网站触发的请求, ,包括负责装载货物的车辆。.
  • 按查询类型筛选 XHR 在哪里 fetch :正是它们在后台获取数据。.

点击正确的查询,查看其 网址, 他的 标头 及其回复。大多数情况下,回复的格式为 JSON, ,有时是HTML格式。.

2. 选择爬取方法

一旦定位到 AJAX 请求,你有两种选择。.

  • 重现该请求 : 你可以直接使用该库在 Python 中重放该通话 requests. 你可以通过以下方式获取原始数据: JSON 或者直接使用HTML,无需浏览器。这是最快的方法。.
  • 无界面浏览器 : 如果网站需要运行 JavaScript 或进行复杂的交互(点击、滚动),请使用 Selenium 在哪里 Playwright. 该工具会像真实用户一样加载页面。.

3. 使用 requests 重现 AJAX 请求

以下是用于重放“网络”选项卡中标识的通话的基本代码。.

导入请求

# 在开发工具中识别出的AJAX请求URL
url = 'https://example.com/ajax-endpoint'

# 请求参数 (需根据实际观察到的数据调整)
params = {
    'page': 1,
    'category': 'technology'
}

# 从'网络'标签页复制过来的请求头(User-Agent、Referer、token 等)
headers = {
    'User-Agent': 'Mozilla/5.0',
    'X-Requested-With': "XMLHttpRequest"
}

# 发送 GET 请求
response = requests.get(url, params=params, headers=headers)

# 检查响应状态
if response.status_code == 200:
    data = response.json()
    print(data)
else:
    print(f"错误 {response.status_code}")

逐行详细说明:

  • import requests : 加载用于发送 HTTP 请求的库。.
  • url : 将此地址替换为在 “网络”选项卡.
  • headers : 复制“网络”选项卡中显示的标头。某些网站要求提供一个 User-Agent, 一个 Referer 或一个令牌 CSRF 以接受该请求。.
  • 一个 状态 200 表示请求成功。.
  • response.json() 将 JSON 响应转换为 Python 字典。.
  • print(data) : 显示提取的数据(商品列表、价格等)。.
  • else : 如果调用失败,则显示错误代码(例如 403 在哪里 404).

4. 使用无头浏览器进行数据抓取(Selenium + BeautifulSoup)

当重现该请求还不够时,浏览器 无头 代你执行 JavaScript。随后,你获取生成的 HTML,然后将其 parses 和 BeautifulSoup (模块 bs4).

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time

# 以无头模式(无界面)启动Chrome
options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)

# 打开通过 AJAX 加载内容的页面
driver.get("https://example.com")

# 等待 JavaScript 加载数据
time.sleep(3)

# 使用 BeautifulSoup 解析渲染后的 HTML
soup = BeautifulSoup(driver.page_source, "html.parser")
articles = soup.find_all("div", class_="article")

for article in articles:
    print(article.get_text())

driver.quit()

给你 Selenium 真正的飞行员 Chrome 负责 渲染 页面,以及 driver.page_source 在 AJAX 内容加载完成后返回 HTML。. Playwright 和 Puppeteer 它们的工作原理相同,但语法不同。.

5. 从生成的 JSON 或 HTML 中提取数据

获取响应后,根据其格式提取有用的信息。.

  • JSON 格式响应 : 使用 response.json() 以获取一个 Python 字典,然后通过键来访问其值。.
  • HTML 格式回复 : 经过 BeautifulSoup (模块 bs4) 与 find 在哪里 select 通过类名或ID来定位元素。.

该选择哪种AJAX抓取方法?

根据你的水平和项目目标,每种方法都有其优势。以下是一个简要对比。.

方法 速度 复杂性 成本 更适合……
请求复制 非常快 高 虚弱的 大规模数据抓取,结构化数据
无界面浏览器 缓慢 意思是 虚弱的 复杂的网站、紧急项目、初学者
扫描应用程序接口 快速地 非常微弱 高 关键项目,无需基础设施维护

实际操作:先从 查询重现 如果 AJAX 端点返回了规范的 JSON 数据,则转到 无头浏览器 一旦 JavaScript 成为不可或缺的。.

AJAX抓取面临哪些挑战及其解决方案?

抓取一个网站 AJAX 会带来一些传统爬虫无法遇到的问题。以下是主要挑战,以及如何应对这些挑战。.

挑战1:乍看之下不可见的内容

当你加载一个AJAX页面时,该 初始HTML通常为空 :数据只有在执行完 JavaScript 之后才会到达。解决方法是使用无头浏览器,例如 Selenium, Playwright 在哪里 Puppeteer, ,负责 渲染 在阅读页面内容之前,请先完整浏览该页面。.

挑战 2:失败的简单查询

仅重现AJAX调用往往是不够的。许多网站 保护其API, ,而且你的请求可能会返回一个 403错误 而浏览器却能正常收到响应。你的请求中缺少了一些信息。实际上,通常需要:

  • 复制这些 headers 必修的 在“网络”选项卡中可见(例如 User-Agent 在哪里 Referer).
  • 添加 象征性 CSRF 或者在服务器要求时使用会话Cookie。.
  • 检查 状态码 从回答中快速找出问题所在。.

挑战3:装载时间的管理

通过AJAX加载的数据可以 迟迟未出现. 如果爬虫过早地读取页面,就无法获取任何内容。根据需要,有两种方法:

  • A 固定暂停 (一 sleep (以秒为单位)后再加载页面。虽然简单,但可靠性较低。.
  • A 有条件等待, ,要干净得多,通过 等待 的 Selenium : 该’隐含的期望 会自动等待这些元素就绪,而’明确要求 在继续执行之前,会等待某个特定的元素或满足某个特定的条件。.

挑战4:在不被封禁的情况下进行大规模网页抓取

只有几页的话,没问题。但如果你抓取的是 数千页, ,网站最终会发现你并封禁你。要想长期坚持下去:

  • 做 将你的请求转发到代理服务器上 为了使IP地址多样化。.
  • 遵守一项 呼叫间隔时间 而不是一次性全部发送。.
  • 管理 分页 和 无限滚动 循序渐进地,就像一位真正的游客一样。.

关键是要保持低调。你的行为越像人类,被踢出的风险就越小。.

常见问题

能否使用BeautifulSoup抓取一个使用AJAX的网站?

不是直接的。. BeautifulSoup 是一个库,用于 静态解析 :它仅读取初始加载的HTML。由于AJAX是通过JavaScript注入内容的,因此你需要配合一个能够执行该JavaScript的工具,例如 Selenium 在哪里 Playwright. 无头浏览器会获取渲染后的HTML,然后你将该内容传递给 BeautifulSoup 为 解析.

另一种选择:直接拦截 AJAX请求 并获取JSON响应,这通常比处理HTML更简单。.

如何处理AJAX网站中的身份验证错误或会话头?

受保护的网站可能会返回错误 401 (未授权)或 403 (禁止)当你的请求未包含正确的内容时 饼干 或 HTTP 头部。解决方案: 拦截这些信息 在初始导航时获取,然后在模拟的 AJAX 请求中重复使用。许多网站还要求一个 CSRF 令牌 或一个页眉 X-Requested-With, ,否则服务器将拒绝该请求。正因如此,一个简单的请求 requests 在浏览器运行时出现故障。.

如何抓取带有无限滚动或“加载更多”按钮的网站?

无限加载是一种AJAX加载形式。要实现其自动化,你可以采用以下两种方法:

  • 识别AJAX请求 该链接会加载额外内容,然后直接显示出来(通常是一个带有分页参数的URL)。.
  • 或者 模拟点击“加载更多”按钮” 通过无头浏览器,例如 Selenium 在哪里 Puppeteer, ,直到恢复所有数据为止。.

是否有适用于AJAX抓取的Chrome扩展程序?

是的。 一些 Chrome扩展程序 可轻松实现简单的AJAX数据抓取,无需编写任何代码。其中最知名的包括:

  • Web Scraper
  • Data Miner
  • Instant Data Scraper

Chrome 扩展程序“Instant Data Scraper”,用于显示从使用 AJAX 的网页中提取的数据。.
Instant Data Scraper,一款无需编程即可从网页收集数据的Chrome扩展程序。©Christina 供 Alucare.fr 使用

在 Selenium 或 Playwright 中,显式“wait”与隐式“wait”有什么区别?

  • 一个 隐式等待 这是一个全局等待,适用于所有元素。如果某个元素未出现,你的脚本会等待一段时间后再抛出错误。.
  • 一个 显式等待 这是一个针对特定元素的条件等待。它仅在条件满足时才进行等待。.

实际上,该 显式等待 这种做法更佳:它既能避免不必要的延迟,又能减少因AJAX内容加载缓慢而导致的错误。.

简而言之,使用AJAX进行网页抓取需要多花一点心思,但只要掌握了正确的方法,就不会遗漏任何内容。你呢?你使用什么方法来抓取AJAX网站?请在评论中分享你的技巧。.

👍您的意见
文章内容丰富
文章客观
文章回答了我的问题
内容是最新的
🔍 发现任何错误? 告诉我们在哪里!

喜欢吗?分享它!

这些内容最初是 法语 (请参见下面的编辑器)。为了向尽可能多的国家提供帮助,我们使用 Deepl 和/或谷歌翻译 API 对该网站进行了多种语言的翻译和校对。我们每月的翻译费用高达数千欧元。如果它不是 100 % 完美,请给我们留言,以便我们进行修正。如果您对校对和提高翻译文章的质量感兴趣,请使用联系表格向我们发送电子邮件!
我们感谢您的反馈意见,以改进我们的内容。如果您想提出改进建议,请使用我们的联系表或在下面留言。 您的意见有助于我们提高网站质量 Alucare.fr


Alucare 是一家独立媒体。请将我们添加到您的谷歌新闻收藏夹,以支持我们:

在讨论区发表评论