大多数网站使用 JavaScript 来加载内容,因此很难抓取数据。如果你尝试使用传统工具,如 requestsBeautifulSoup 您将会错过仅在页面完全加载后才显示的信息。

本文探讨如何抓取 JavaScript 呈现的页面。我们将讨论静态内容与动态内容、抓取的挑战以及可用的工具。我们将重点介绍 Pyppeteer,这是一款功能强大的工具,可让您使用 Python 处理 JavaScript 内容。

我们将向您介绍使用 Pyppeteer 从动态网页中提取产品详细信息的实际示例。您还将获得有关解决常见问题以及如何使用以下方法提高抓取效率的提示: 爬虫库 Smart Proxy.

目录

  1. 静态页面与 JavaScript 渲染页面
  2. 抓取动态内容的挑战
  3. 使用 Python 抓取 JavaScript 渲染页面的热门工具
  • 剧作家
  • 皮皮特师
  1. 实例:使用 Pyppeteer 抓取动态内容
  • 先决条件
  • 设置Python环境
  • 检查 JavaScript 呈现的页面中的选择器
  • 使用 Pyppeteer 创建 Scraper 来提取产品详细信息
    • 创建抓取脚本
    • 定义 Scraper 函数
    • 运行刮刀
    • 完整脚本示例
  1. 常见陷阱和故障排除技巧
  • 处理延迟和超时
  • 解决与页面加载和渲染相关的错误
  1. 使用 Crawlbase 进行优化 Smart Proxy
  2. 总结
  3. 常见问题

静态页面与 JavaScript 渲染页面

当谈到网络抓取时,理解静态页面和 JavaScript 呈现的页面之间的区别是关键。

列出静态页面和 JS 渲染页面之间差异的图片

静态网页 很简单。当您访问网站时,它们会加载所有内容。您可以使用以下简单工具 requests or BeautifulSoup 从这些页面抓取数据,因为数据已经在 HTML 中了。

另一方面, JavaScript 渲染的页面 使用 JavaScript 动态加载内容。这意味着您最初看到的 HTML 可能没有您想要的数据。JavaScript 在页面加载后运行并从服务器提取更多数据。这使得抓取变得更加困难,因为当您第一次访问页面时数据可能不在 HTML 中。

例如,如果您尝试从电子商务网站抓取产品详细信息,您可能会发现产品列表仅在页面加载完成后才会显示。在这种情况下,传统的抓取方法将不起作用,您需要一个可以处理 JavaScript 执行的更高级的工具。

抓取动态内容的挑战

抓取 JavaScript 呈现的页面本身就存在一系列挑战。主要挑战如下:

内容加载时间

JavaScript 异步加载内容,因此元素可能无法立即使用。抓取过早可能会导致数据丢失。

改变元素选择器

网站经常更改其设计,这会改变 HTML 结构和选择器。如果您的抓取工具依赖于这些,当发生更改时,它会崩溃。

验证码和反爬取措施

许多网站都设置了 CAPTCHA 和 IP 拦截来防止数据抓取。在遵守服务条款的同时浏览这些网站可能会很棘手。

处理分页

动态页面通常对数据进行分页,因此您的抓取工具无法浏览多个页面来收集所有数据。

资源密集型

JavaScript 渲染可能占用大量资源,因此抓取需要更长的时间,并且服务器负载也会增加。

抓取 JavaScript 呈现的页面时,选择的工具很重要。以下是三种常用选项:Selenium、Playwright 和 Pyppeteer。

是一款流行的网页抓取工具。它可以控制网页浏览器并模拟用户交互。它非常适合抓取动态内容。Selenium 支持多种语言,包括 Python。

优点:

  • 多功能:适用于多种浏览器(Chrome、Firefox、Safari)。
  • 鲁棒性:适合测试Web应用程序。
  • 广泛的社区支持:有许多教程和资源可供使用。

使用案例:Selenium 适用于需要浏览器自动化的项目,例如登录网站或填写表格。

剧作家

剧作家 是一款较新的工具,用于抓取动态内容,越来越受欢迎。它支持多种语言,包括 Python,而且速度很快。

优点:

  • 跨浏览器测试:适用于 Chromium、Firefox、WebKit。
  • 自动等待:减少脚本中的手动延迟。
  • 简易安装:简单易用

使用案例:Playwright 非常适合需要速度和可靠性的项目,尤其是在测试 Web 应用程序时。

皮皮特师

皮皮特师 是 Puppeteer 的 Python 端口,Puppeteer 是一个流行的 Node.js 库。它允许您控制无头 Chrome 浏览器。

优点:

  • 无头模式:由于无需渲染 UI,因此速度更快。
  • 轻松导航:简化截屏和生成 PDF 等任务。
  • JavaScript 执行:有效地与 JavaScript 密集型页面进行交互。

使用案例:Pyppeteer 非常适合从大量使用 JavaScript 的现代网站(如电子商务平台)抓取数据。

总而言之,每种工具都有其优势和最佳使用场景。根据项目需求,您可以选择最适合您需求的工具。

实例:使用 Pyppeteer 抓取动态内容

在本节中,我们将通过一个实际示例来介绍如何使用 Pyppeteer 从 JavaScript 渲染的网页中抓取动态内容。我们将介绍从设置环境到提取产品详细信息的所有内容。

先决条件

  • 系统上已安装 Python 3.6+
  • 对 Python 和 HTML 有基本了解

设置Python环境

在深入抓取之前,让我们先准备好 Python 环境。

创建一个新的项目目录:

1
2
MKDIR pyppeteer_scraper
cd pyppeteer_scraper

设置虚拟环境:

1
2
python -m venv venv
资源 venv/bin/激活 # 对于 Windows,使用 venv\Scripts\activate

安装必要的软件包:

1
pip 安装 pyppeteer

备注:如果遇到问题,请确保您使用的是正确的 Python 版本并检查是否存在任何安装错误。

检查 JavaScript 呈现的页面中的选择器

设置好环境后,您将需要找到要抓取的元素的选择器。方法如下:

  1. 打开浏览器并转到目标页面。在此示例中,我们将使用下面的沃尔玛 URL,因为沃尔玛也使用 JavaScript 渲染。
1
https://www.walmart.com/search?q=smartwatch
  1. 右键单击产品标题并选择检查以打开开发人员工具。
对选择器 JavaScript 呈现页面进行检查的屏幕截图
  1. 将鼠标悬停在 HTML 结构中的元素上,以查看关联的选择器。例如,查找在页面加载过程中稳定的类名或唯一属性,例如 data-* 属性。

使用 Pyppeteer 创建抓取工具来提取产品详细信息

创建抓取脚本

创建一个名为的新 Python 文件 scraper.py 并首先添加以下导入:

1
2
进口 异步
pyppeteer 进口 发射

定义 Scraper 函数

接下来,我们将定义一个处理抓取过程的函数。此函数将启动浏览器,使用自定义 User-Agent 和标头导航到所需的 URL,并提取产品详细信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
异步 DEF scrape_product_details(网址):
浏览器= 等待 发射()
页 = 等待 browser.newPage()

# 设置自定义 User-Agent 和标头
等待 页面.setUserAgent(“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,如 Gecko) Chrome/58.0.3029.110 Safari/537.3”)
等待 页面.setExtraHTTPHeaders({
“接受语言”: 'en-US,en;q=0.9',
‘接受编码’: ‘gzip,deflate,br’,
})

等待 页面.转到(网址)

等待 异步io.睡眠(10) # 等待10秒

标题 = 等待 页面.评估('''() => {
返回 Array.from(document.querySelectorAll('span[data-automation-id="product-title"]')).map(x => x.innerText);
''')

价格 = 等待 页面.评估('''() => {
返回 Array.from(document.querySelectorAll('div[data-automation-id="product-price"] span.w_iUH7'))
.map(x => x.innerText.replace('当前价格', ''));
''')

标题,价格 in 拉链(标题、价格):
打印(f'标题: 隐私政策, 价格: {价格}')

等待 browser.close()

运行刮刀

将其添加到您的 scraper.py 文件,以便它在运行脚本时运行。

1
2
3
if __名字__ == “__主要的__”:
网址= 'https://www.walmart.com/search?q=smartwatch' # 替换为你的目标 URL
asyncio.get_event_loop()。run_until_complete(scrape_product_details(url))

完整脚本示例

以下是完整的 scraper.py 文件应如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
进口 异步
pyppeteer 进口 发射

异步 DEF scrape_product_details(网址):
浏览器= 等待 发射()
页 = 等待 browser.newPage()

# 设置自定义 User-Agent 和标头
等待 页面.setUserAgent(“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,如 Gecko) Chrome/58.0.3029.110 Safari/537.3”)
等待 页面.setExtraHTTPHeaders({
“接受语言”: 'en-US,en;q=0.9',
‘接受编码’: ‘gzip,deflate,br’,
})

等待 页面.转到(网址)

等待 异步io.睡眠(10) # 等待10秒

标题 = 等待 页面.评估('''() => {
返回 Array.from(document.querySelectorAll('span[data-automation-id="product-title"]')).map(x => x.innerText);
''')

价格 = 等待 页面.评估('''() => {
返回 Array.from(document.querySelectorAll('div[data-automation-id="product-price"] span.w_iUH7'))
.map(x => x.innerText.replace('当前价格', ''));
''')

标题,价格 in 拉链(标题、价格):
打印(f'标题: 隐私政策, 价格: {价格}')

等待 browser.close()

if __名字__ == “__主要的__”:
网址= 'https://www.walmart.com/search?q=smartwatch'
asyncio.get_event_loop()。run_until_complete(scrape_product_details(url))

当您运行脚本时,它将打开无头浏览器,导航到指定的 URL,并将产品标题和价格打印到控制台。

常见陷阱和故障排除技巧

抓取使用 JavaScript 加载内容的网站时,您可能会遇到一些常见问题。以下是一些可帮助您解决问题的提示。

处理延迟和超时

网页抓取可能比较棘手,因为网页需要时间加载。如果您的抓取工具在加载之前尝试访问元素,则会出错。以下是一些处理延迟的方法:

  1. 使用固定等待时间:您可以在抓取工具开始查找元素之前添加固定的等待时间。这为页面加载提供了时间。例如,您可以使用 sleep 函数:
1
等待 异步io.睡眠(5)  # 等待5秒
  1. 动态等待:不要仅仅依赖固定等待,可以考虑使用动态等待,例如 waitForSelector。这将暂停脚本,直到给定的元素出现在页面上。

由于页面加载或渲染问题,您可能会遇到错误。以下是一些常见问题及其解决方法:

  1. 检查网址:确保您导航到正确的 URL。输入错误会导致“页面未找到”错误。
  2. 检查页面元素:使用浏览器的开发人员工具检查您正在抓取的元素,如果 HTML 结构已发生更改,请更新您的选择器。
  3. 网络问题:如果您的互联网速度慢或不稳定,则会影响页面加载。请尝试在更快的连接上测试您的抓取工具。
  4. 处理 JavaScript 错误:某些网站会阻止抓取工具或出现 JavaScript 错误,导致页面无法呈现。如果您的抓取工具无法正常工作,请检查控制台中是否存在 JavaScript 错误并调整抓取策略。
  5. 使用错误处理:在代码中使用 try-except 块来捕获和处理错误。这样,即使遇到小问题,您的抓取工具仍会继续运行。

使用 Crawlbase 进行优化 Smart Proxy

爬虫库 Smart Proxy 通过多个 IP 地址路由请求,网站无法阻止您,从而帮助您更快地进行抓取。此服务可防止 IP 被阻止,通过同时发出请求加速数据收集,并允许访问特定区域的内容。

使用 Crawlbase Smart Proxy, 注册申请 SearchGPT 等候名单 创建一个帐户并获取代理凭据。然后,通过 Crawlbase 路由配置您的抓取工具。以下是 Python 中的一个简单示例:

1
2
3
4
5
6
7
代理网址 = 'http://_USER_TOKEN_:@smartproxy.crawlbase.com:8012'

异步 - pyppeteer.启动({
‘参数’[f'--代理服务器={代理网址}']
}) as 浏览器:
页 = 等待 browser.newPage()
等待 页面.转到('https://example.com')

更换 _USER_TOKEN_ 使用您的 Crawlbase 令牌。通过集成 Crawlbase Smart Proxy 纳入您的工作流程,您可以提高效率并减少 IP 块中断的机会,从而实现更成功的数据提取。

总结

抓取 JavaScript 呈现的页面可能具有挑战性,但很有趣。借助 Pyppeteer、Selenium 或 Playwright 等合适的工具,您可以做到这一点。在本博客中,我们介绍了静态页面和 JavaScript 呈现的页面之间的差异、常见挑战以及一个实用示例(Pyppeteer)以帮助您入门。

使用优化技术,例如 爬虫库 Smart Proxy 以更快地进行抓取并避免 IP 禁令。当您开始进行网页抓取时,请记住遵守目标网站的服务条款。遵循最佳实践,您将获得所需的数据,同时与网络服务保持良好的关系。祝您抓取愉快!

常见问题

问:什么是 JavaScript 呈现的页面?

JavaScript 呈现的页面是使用 JavaScript 动态加载内容的网页。与立即显示所有内容的静态页面不同,JavaScript 呈现的页面在初始页面加载后加载数据。这使得抓取变得更加困难,因为内容不会立即显示在页面源代码中。

问:为什么我需要一个特殊的工具来抓取 JavaScript 呈现的页面?

需要使用 Selenium、Pyppeteer 或 Playwright 等特殊工具来抓取 JavaScript 渲染的页面,因为它们可以模拟真实用户的浏览器。这些工具允许您等待页面完全加载并呈现内容后再提取数据。如果没有它们,您可能会错过重要信息或获得不完整的结果。

问:如何避免在抓取数据时被阻塞?

为了避免被阻止,您可以使用轮换用户代理、在请求之间增加延迟以及使用代理等技术。 爬虫库 Smart Proxy 可以帮助您管理 IP,这样网站就不会检测并阻止您的抓取活动。请务必遵守网站的服务条款,以确保您的抓取行为合乎道德。