网页抓取有时涉及从动态内容中提取数据。对于大多数人,尤其是非技术专业人士来说,这可能是一项艰巨的任务。此外,抓取动态内容需要比传统的网页抓取更高的精度。这是因为大多数动态内容都是通过 JavaScript 加载的,这使得提取信息变得困难。

Selenium 和 BeautifulSoup 等著名库可以有效地抓取动态内容。 Crawlbase 创建了无缝处理动态内容的爬网解决方案。本文将教您如何使用 Selenium 和 Beautiful Soup 有效地抓取动态内容,特别是 JS 渲染的页面。

以下是我们将介绍的内容的详细分类:

目录

  1. 了解动态内容
  • 什么是动态内容?
  • JS渲染页面示例
  1. 抓取动态内容的工具
  • 硒概述
  • 美汤概述
  1. 设置您的环境
  • 安装 Selenium 和 WebDriver
  • 安装美丽汤
  1. 使用 Selenium 实现动态内容
  • 使用 Selenium 启动浏览器
  • 浏览网页并与之交互
  • 处理 JavaScript 渲染元素
  1. 用美丽的汤提取数据
  • 美汤与硒的融合
  • 解析 HTML 内容
  • 提取相关信息
  1. 处理常见问题
  • 处理超时和延迟
  • 管理会话和 Cookie
  • 绕过反抓取机制
  1. Crawlbase 抓取 API:另一种方法
  • Crawlbase爬取API概述
  • 使用 Crawlbase 的好处
  • 如何将 Crawlbase 集成到您的项目中
  • 与硒和美汤的比较
  1. 总结
  2. 常见问题

了解动态内容

什么是动态内容?

就本文而言,动态内容是根据人口统计信息、用户兴趣、用户行为、一天中的时间等而变化的 Web 内容。动态内容与静态内容(对所有用户保持不变)不同,因为它是动态的,通常需要一些 JavaScript 来完成此任务。从为用户个性化的电子商务网站产品推荐到社交媒体动态的实时更新。

对于动态内容网页,您通常首先会看到基本结构。随后,其余内容由 JavaScript 加载,JavaScript 从服务器获取数据,然后将其显示在页面上。这就是传统网页抓取方法效果不佳的原因之一。他们只能检索静态 HTML,并且常常会错过动态加载的项目。需要能够与页面上的 JavaScript 交互并执行 JavaScript 的工具才能有效地抓取动态内容。

JS渲染页面示例

显示用于抓取动态内容的 JS 渲染页面示例的图像
  1. 电子商务网站:电子商务网站(例如 Amazon 或 eBay)使用动态内容来显示产品列表、价格和评论。每个搜索查询、用户、库存更新和实时变化的内容都不同。
  2. 动态内容:Facebook、Twitter 和 Instagram 等社交媒体平台或多或少基于动态内容。 JavaScript 加载用户提要、评论和点赞,创建每个登录用户的实时个人资料。
  3. 新闻网站:加载文章、标题和突发新闻更新应该在使用动态内容的新闻网站上进行。比如让服务能够为用户带来最新的信息而无需刷新页面。
  4. 交互式网络应用程序:Google 地图或在线电子表格(例如 Google 表格)等网络应用程序使用动态内容,根据使用输入实时更新地图、数据和其他元素。

既然您知道动态内容是如何工作的并且可以识别诸如 JS 渲染页面之类的内容,您将更容易抓取这些动态内容。您可以有效地从许多站点中抓取动态内容,对于动态内容导航和交互,您可以使用 Selenium,对于数据提取,您可以使用漂亮的汤。

抓取动态内容的工具

当涉及到从网络上抓取动态内容时,拥有合适的工具至关重要。 Selenium 和 Beautiful Soup 是广泛用于此目的的两种流行工具。

硒概述

Selenium 是一个强大的自动化工具,主要用于测试 Web 应用程序。然而,它不仅仅可以做测试,因此它是动态网页抓取的一个不错的选择。使用 Selenium,您可以像实际用户一样以编程方式控制 Web 浏览器并与 JavaScript 渲染的页面进行交互。

使用 Selenium,您可以启动实际的浏览器,转到特定的网页,与页面上的元素交互,甚至运行 JavaScript Toastmasters。这使得它成为抓取具有大量基于 JavaScript 的非静态(它们在 DOM 之后加载)内容的网站的完美工具。该工具支持多种编程语言(Python、Java、JavaScript),对于具有不同技能的不同开发人员来说非常全面。

美汤概述

另一方面,Beautiful Soup 是一个 Python 库,可以让我们轻松解析 HTML 和 XML 文档。虽然它不能像 Selenium 那样与网页交互,但从 Selenium 导航到的 HTML 内容中提取数据要快得多。

一旦 Selenium 完成加载网页并呈现动态内容,您就可以使用 Beautiful Soup 处理 HTML 以仅获取所需的信息。 Beautiful Soup 提供了用于导航和搜索已解析 HTML 树的工具,包括根据标签、属性或 CSS 选择器查找特定元素的方法。

结合用于动态内容交互的 Selenium 和用于数据提取的 Beautiful Soup,您可以构建强大的网页抓取解决方案,甚至能够处理最复杂和动态的网页。

设置您的环境

在开始从网络上抓取动态内容之前,您需要做一些准备工作,包括通过安装您将使用的工具和依赖项来设置您的环境。确保您的系统中已安装 Python 和 PIP。在这里,我们将向您展示如何安装 Selenium、WebDriver 和 Beautiful Soup。

安装 Selenium 和 WebDriver

  1. 安装硒:首先,您需要使用 Python 包管理器 pip 安装 Selenium 库。打开命令行界面并运行以下命令:
1
点安装硒
  1. 下载网络驱动程序:WebDriver是Selenium用来控制Web浏览器的工具。您需要为您想要自动化的浏览器下载适当的 WebDriver。您可以下载网络驱动程序 请点击此处尝试搜索。.

    备注:从Selenium 4.10.0开始,驱动程序管理器是内置的,会自动下载必要的驱动程序,没有任何提示。例如,在 Mac 或 Linux 上,如果在 PATH 中找不到驱动程序,则会将它们下载到 ~/.cache/selenium 文件夹中。

安装美丽汤

Beautiful Soup 可以像 Selenium 一样使用 pip 安装。在命令行界面中运行以下命令:

1
点安装beautifulsoup4

安装 Selenium 和 WebDriver 后,您将能够自动化 Web 浏览器并与动态内容交互。同样,Beautiful Soup 将使您能够解析 HTML 并从网页中提取数据。设置好环境后,您就可以准备好使用这些强大的工具来深入抓取动态内容。

使用 Selenium 实现动态内容

Selenium 是一种多用途工具,使您能够与浏览器交互并获取所需的数据,这非常适合抓取动态内容。本节介绍如何正确使用 selenium 来操作浏览器(启动浏览器、导航网页、处理 JavaScript 渲染元素)。

使用 Selenium 启动浏览器

要开始使用 Selenium 抓取动态内容,您需要首先启动 Web 浏览器。 Selenium 支持多种浏览器,包括 Chrome、Firefox 和 Safari。以下是如何在 Python 中使用 Selenium 启动 Chrome 浏览器:

1
2
3
4
5
6
7
8
进口 网络驱动
selenium.webdriver.common.by 进口 By

# Chrome 浏览器选项
选项 = webdriver.ChromeOptions()

# 启动 Chrome 浏览器
驱动程序 = webdriver.Chrome(选项=选项)

使用 Selenium 启动浏览器后,您可以导航到网页并与其元素进行交互。以下是导航到网页并与按钮、表单和链接等元素进行交互的方法:

1
2
3
4
5
6
7
8
9
10
# 导航到网页
驱动程序.get('https://example.com')

# 通过 ID 找到一个元素并点击它
元素 = driver.find_element(By.ID, 'some_element_id')
元素.click()

# 通过名称查找输入字段并输入文本
input_field = driver.find_element(By.NAME, '一些输入字段名称')
输入字段.发送键(“需要输入一些文字”)

处理 JavaScript 渲染元素

Selenium 的主要优势之一是它能够处理 JavaScript 渲染元素。这允许您与初始页面加载后加载的动态内容进行交互。以下是如何等待特定元素出现在页面上然后与其进行交互:

1
2
3
4
5
6
7
8
9
10
11
 selenium.webdriver.common.by 进口 By
selenium.webdriver.support.ui 进口 网络驱动程序等待
selenium.webdriver.support 进口 预期条件 as EC

# 等待元素可见
元素= WebDriverWait(驱动程序, 10)。直到(
EC.visibility_of_element_ located((By.ID, 'some_element_id'))
)

# 一旦元素可见,就与其交互
元素.click()

在下一节中,我们将探讨如何将 Beautiful Soup 与 Selenium 集成,以从 JS 渲染的页面中提取数据。

用美丽的汤提取数据

Beautiful Soup 是一个 Python 库,擅长解析 HTML 并从网页中提取数据。当与 Selenium 一起使用时,它成为抓取动态内容的强大工具。在本节中,我们将探讨如何将 Beautiful Soup 与 Selenium 集成,解析 HTML 内容,并从 JS 渲染的页面中提取相关信息。

美汤与硒的融合

将 Beautiful Soup 与 Selenium 集成非常简单,并且允许您利用这两个库的优势。您可以使用 Beautiful Soup 来解析使用 Selenium 获取的网页的 HTML 内容。我们以 TikTok 视频 URL 为例,抓取动态加载的评论。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
进口 网络驱动
bs4 进口 美丽汤
进口 JSON

# Chrome 浏览器选项
选项 = webdriver.ChromeOptions()

# 启动 Chrome 浏览器
驱动程序 = webdriver.Chrome(选项=选项)

# 导航至 TikTok 视频页面
驱动程序.get('https://www.tiktok.com/@khaby.lame/video/7255327059302419738')

# 给页面一些时间来加载评论
driver.implicitly_wait(10)

# JavaScript渲染完内容后获取页面源
页面源 = 驱动程序.页面源

解析 HTML 内容

现在您已经有了页面源代码,使用 Beautiful Soup 来解析 HTML 内容:

1
2
# 用 Beautiful Soup 解析 HTML 内容
汤 = BeautifulSoup(page_source, 'html.parser')

提取相关信息

要从 TikTok 视频中提取评论,请识别评论部分的 HTML 结构。检查页面以查找相关标签和类。在下面的示例中,我们使用了撰写本博客时可用的最新选择器。

1
2
3
4
5
6
7
8
9
10
# 抓取评论列表
comments_listing = soup.select(“div[data-e2e='搜索评论容器'] > div[class*='CommentListContainer'] > div[class*='DivCommentItemContainer']”)

# 提取并打印评论文本
评论列表 = []
评论 in 评论列表:
comments_list.append(comment.select_one(“div[class*='DivCommentContentContainer'] p[data-e2e='comment-level-1'] > 跨度”).text.strip())

# 打印抓取的结果
打印(json.dumps(comments_list, 缩进=2, 确保_ascii=))

在下一节中,我们将讨论人们在动态内容网络抓取时面临的一些常见问题。

处理常见问题

从网页中抓取动态内容时,您可能会遇到许多会减慢抓取活动速度的挑战。在本节中,我们将介绍一些有关超时和延迟、会话和 cookie 管理以及克服反抓取机制的常见问题。

处理超时和延迟

动态内容通常需要等待 JavaScript 加载页面上的元素。如果您的抓取工具等待的时间不够长,它可能会错过重要数据。

隐式等待:Selenium 提供隐式等待来为所有元素设置默认等待时间。

1
driver.implicitly_wait(10)  # 等待最多 10 秒让元素出现

显式等待:为了获得更多控制,请使用显式等待来等待特定条件。

1
2
3
4
5
6
 selenium.webdriver.common.by 进口 By
selenium.webdriver.support.ui 进口 网络驱动程序等待
selenium.webdriver.support 进口 预期条件 as EC

元素= WebDriverWait(驱动程序, 20)。直到(
EC.presence_of_element_ located((By.ID, 'some_element_id'))

管理会话和 Cookie

网站经常使用会话和 cookie 来跟踪用户。管理这些对于抓取动态内容至关重要,特别是当您需要登录或维护会话时。

存储 Cookie:登录后,保存cookie以便在后续请求中使用。

1
cookies = driver.get_cookies()

加载 Cookie:在发出请求之前,加载cookie以维持会话。

1
2
3
  饼干 in 饼干:
driver.add_cookie(cookie)
驱动程序.刷新() # 刷新以应用cookie

绕过反抓取机制

许多网站采用反抓取机制来防止自动访问。以下是绕过这些措施的一些策略:

随机化用户代理:更改 User-Agent 标头以模仿不同的浏览器。

1
2
3
4
5
6
7
8
9
10
进口 网络驱动

# Chrome 浏览器选项
选项 = webdriver.ChromeOptions()

# 设置所需的用户代理
选项.add_argument(“--user-agent=您的用户代理字符串”)

# 创建驱动程序
驱动程序 = webdriver.Chrome(选项=选项)

使用代理:使用代理轮换 IP 地址以避免检测。

1
2
3
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://your-proxy-server:port')
驱动程序 = webdriver.Chrome(选项=chrome_options)

类人交互:在动作之间引入随机延迟来模拟人类行为。

1
2
3
4
进口
进口 随机

时间.睡眠(随机.均匀(1, 3)) # 1到3秒之间的随机延迟

通过理解和解决这些常见问题,您可以增强有效抓取动态内容的能力。通过这些策略,您可以驾驭 JS 渲染页面的复杂性,并确保您的抓取工作取得成功。接下来,我们将探索使用 Crawlbase 抓取 API 抓取动态内容的替代方法。

Crawlbase 抓取 API:另一种方法

虽然 Selenium 和 Beautiful Soup 是抓取动态内容的强大方法,但 Crawlbase Crawling API 是一个强大的 Web 抓取服务,旨在处理复杂的网页,包括那些具有动态内容和 JavaScript 渲染元素的网页。它抽象了抓取的大部分复杂性,使您能够专注于提取所需的数据,而无需直接处理浏览器自动化。

使用 Crawlbase 的好处

  1. 易用性:Crawlbase 通过处理 JavaScript 渲染、会话管理和幕后的其他复杂性来简化抓取过程。
  2. 可扩展性:可以高效处理大规模抓取任务,适合需要多源数据的项目。
  3. 值得信赖:Crawlbase 旨在绕过常见的反抓取措施,确保对数据的一致访问。
  4. 速度:Crawlbase通过分布式基础设施比传统方法更快地执行抓取任务

如何将 Crawlbase 集成到您的项目中

将 Crawlbase 集成到您的项目中非常简单。您可以通过以下方式开始:

  1. 注册并获取 JS 令牌:首先,注册一个Crawlbase帐户并获取您的JS Token。
  2. 安装 Crawlbase 库:如果尚未安装,请安装crawlbase 库。
1
pip 安装crawllbase
  1. 使用Crawlbase API:以下是如何使用 Crawlbase 抓取 API 从网页抓取动态内容的基本示例。
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 爬行基地 进口 抓取API
bs4 进口 美丽汤
进口 JSON

# 初始化Crawlbase CrawlingAPI对象
爬行 API = 爬行 API({“令牌”: “CRAWLBASE_JS_TOKEN”})

选项= {
'ajax_等待': '真的',
'页面等待': 10000,
'用户代理': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, 如 Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0',
'设备': '移动的'
}

# 使用 Crawlbase Crawling API 获取 HTML 的函数
DEF fetch_html_crawlbase(网址):
全球化 爬行API,选项
尝试:
响应=crawling_api.get(url,选项)
if 回复[“标题”]['pc_status'] == '200':
回报 回复['身体']。解码('utf-8')
其他:
打印(f“无法获取 HTML。Crawlbase 状态代码: {回复[“标题”]['pc_status']}")
回报 不包含
特殊课程 as e:
打印(f“发生错误: {STR(e)}")
回报 不包含

DEF scrape_comment_content(评论):
评论内容 = 评论.select_one(“div[class*='DivCommentContentContainer'] p[data-e2e='comment-level-1'] > 跨度”).text.strip()
回报 评论内容

DEF ():

# 获取 TikTok 视频页面的 HTML 内容
html_content = fetch_html_crawlbase(“https://www.tiktok.com/@khaby.lame/video/7255327059302419738”)

# 使用 BeautifulSoup 解析 HTML 内容
汤 = BeautifulSoup(html_content, “html.解析器”)

# 抓取评论列表
comments_listing = soup.select(“div[data-e2e='搜索评论容器'] > div[class*='CommentListContainer'] > div[class*='DivCommentItemContainer']”)

# 迭代评论并抓取评论内容和评论者详细信息
评论列表 = []
评论 in 评论列表:
comments_list.append(scrape_comment_content(评论))

# 打印抓取的结果
打印(json.dumps(comments_list, 缩进=2, 确保_ascii=))

if __名字__ == “__主要的__”:
主()

首先导入必要的库并使用身份验证详细信息初始化 Crawlbase CrawlingAPI 对象。它配置选项以等待 AJAX 内容、设置用户代理并指定移动设备。这 fetch_html_crawlbase 函数使用 Crawlbase 获取 TikTok 页面的 HTML 内容并检查响应状态。如果成功,则返回 HTML 内容。这 scrape_comment_content 函数使用 BeautifulSoup 提取每个评论的文本。在 main 函数中,脚本获取并解析 HTML 内容,抓取评论列表,并以 JSON 格式打印它们。执行时,脚本运行 main 函数执行抓取并显示结果。

与硒和美汤的比较

显示抓取动态内容时 Selenium 和 Beautiful Soup 之间比较的图像

Crawlbase 爬行 API 简化了抓取动态内容的过程,特别是对于需要可扩展性和速度的项目。

总结

抓取动态内容一开始似乎令人畏惧,但使用正确的工具和技术,这将成为一项简单的任务。使用 Selenium 处理动态内容并使用 Beautiful Soup 解析 HTML 可以使您有效地抓取 JS 渲染的页面并提取有价值的信息。 Selenium 允许您像人类用户一样导航网页并与之交互,这使其成为处理 JavaScript 渲染元素的理想选择。 Beautiful Soup 通过提供一个强大且易于使用的工具来从 Selenium 检索的 HTML 内容中解析和提取数据来补充这一点。

我们推荐使用 Crawlbase 爬取 API 为那些寻求简单性和可扩展性的人提供了一个绝佳的选择。它可以处理抓取动态内容的许多复杂问题,使您能够专注于最重要的事情:提取所需的数据。

如果您有兴趣了解有关网络抓取的更多信息,请阅读我们的以下指南。

📜 cURL 用于使用 Python、JAVA 和 PHP 进行网页抓取
📜 如何在网页抓取中绕过验证码
📜 如何使用 Chatgpt 抓取网站
📜 从网站上抓取表格
📜 如何抓取 Redfin 属性数据

如果您有任何问题或反馈,我们的 支持团队 随时为您的网络抓取之旅提供帮助。感谢您遵循本指南。

常见问题

问:如何抓取动态生成的内容?

要抓取动态生成的内容,您需要可以处理 JavaScript 渲染页面的工具。为此,硒是一种流行的选择。它允许您像人类一样自动化 Web 浏览器并与 Web 元素进行交互。通过使用 Selenium,您可以在提取所需数据之前加载整个页面,包括动态内容。

如果你想大规模抓取数据而不被阻止,你可以考虑使用像 Crawlbase 爬取 API.

问:如何在Python中获取动态内容?

在Python中获取动态内容可以通过使用Selenium来实现动态内容。使用适当的浏览器选项启动所需的浏览器。然后,导航到网页,与必要的元素交互以加载动态内容,最后使用 Beautiful Soup 等库来解析和提取数据。

这是一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
进口 网络驱动
bs4 进口 美丽汤

# Chrome 浏览器选项
选项 = webdriver.ChromeOptions()

# 启动 Chrome 浏览器
驱动程序 = webdriver.Chrome(选项=选项)

驱动程序.get('https://example.com')

# 等待动态内容加载
driver.implicitly_wait(10)

# 获取页面源码并用Beautiful Soup解析
页面源 = 驱动程序.页面源
汤 = BeautifulSoup(page_source, 'html.parser')

# 提取动态内容
动态内容 = soup.find_all('div', 类_='动态类')

如果您不想手动执行操作并希望大规模抓取数据,则可以考虑使用 Crawlbase 爬取 API.

问:如何从网站中提取动态数据?

要从网站提取动态数据,请按照下列步骤操作:

  1. 使用 Selenium 或第三方 API: 使用类似的工具 / 木偶戏 或第三方 API,例如 Crawlbase 爬取 API 加载网页。这些工具可以处理 JavaScript 渲染,确保显示所有动态内容。
  2. 检索页面源:动态内容完全加载后,检索页面源。这包括构成渲染内容的所有 HTML、CSS 和 JavaScript。
  3. 解析和提取数据:使用解析库或工具,例如python中的Beautiful Soup,来分析HTML并提取所需的信息。这些工具允许您定位 HTML 中的特定元素并提取相关数据。

通过使用处理动态内容和 HTML 解析的工具,或选择 Crawlbase Crawling API 等综合解决方案,您可以有效地从使用 JavaScript 呈现数据的网站中抓取动态内容。

问:如何抓取动态 URL?

抓取动态 URL 涉及从内容动态更改或更新的网页中检索数据(通常是由于 JavaScript)。这是一个简单的指南:

  1. 设置:确保您拥有必要的工具,例如 / 木偶戏 或类似的 API Crawlbase 爬取 API.
  2. 访问网址:使用您选择的方法访问动态 URL。
  3. 处理动态:如果内容根据用户交互或时间而变化,请确保您的抓取方法适应这种情况。像 selenium 这样的工具通常具有等待元素加载或更改的功能。
  4. 提取数据:加载动态内容后,使用抓取工具提取所需的数据。
  5. 处理错误:为潜在的错误做好准备,例如超时或丢失数据,并在抓取代码中妥善处理它们。

通过执行这些步骤,您可以有效地从任何 URL 中抓取动态内容,无论它是如何生成或更新的。