网络抓取是从网页中提取信息的必要手段。BeautifulSoup 是一个有效且非常友好的 Python 包,通常可以轻松收集用于研究、分析和自动执行重复任务的数据。本博客将讨论利用 BeautifulSoup 从网络抓取数据的步骤。

BeautifulSoup 在世界各地广泛使用,用于将 XML 和 HTML 页面转换为 Python 对象。新手程序员可以轻松使用它,因为该包具有用于定位和收集所需维度的简单界面。

刚接触网页抓取和 Python,或者想提高一下技能?阅读此博客后,您将了解如何使用 BeautifulSoup。

目录

  1. 为什么要使用 BeautifulSoup?
  2. 设置您的环境
  • 安装所需的库
  • 创建你的项目
  1. 理解 HTML 和 DOM
  • 什么是 DOM?
  • BeautifulSoup 如何与 HTML 交互
  1. 使用 BeautifulSoup 进行网页抓取
  • 解析 HTML
  • 使用提取数据 find()find_all()
  • 导航标签和属性
  1. 创建你的第一个网页抓取脚本
  • 分步脚本示例
  • 从网站抓取数据
  1. 处理网页抓取中的常见问题
  • 处理错误
  • 管理动态内容
  • 处理分页
  • 避免被阻止
  1. 道德网络抓取实践
  • 遵守网站条款和条件
  • 避免服务器过载
  1. 总结
  2. 常见问题

为什么要使用 BeautifulSoup?

BeautifulSoup 是 Python 中用于网页抓取的最知名的 Python 库之一,简单高效。它允许您通过 HTML 和 XML 文档从网站中提取信息。

该图片展示了使用 BeautifulSoup 的原因

易于操作

BeautifulSoup 易于使用,只需几行代码即可抓取网站数据,非常适合初学者。

灵活解析

它支持多种解析器,如默认的 Python HTML 解析器、lxml 和 html5lib,因此它可以适应任何 Web 结构。

高效搜索和导航

BeautifulSoup 允许您搜索和浏览 HTML 元素。使用 find() 和 find_all(),您可以提取文本、链接或图像等数据。

社区支持

社区很大,所以你会找到很多教程和常见问题的答案。

与其他库兼容

BeautifulSoup 可以轻松地与 Selenium 一起使用来获取动态内容和请求以检索网站。

简而言之,BeautifulSoup 是一款可靠、灵活且易于使用的网络抓取工具,适合初学者和专家。

设置您的环境

在开始使用 BeautifulSoup 抓取网站数据之前,您需要设置开发环境。这意味着安装所需的库并为脚本创建项目目录。

安装所需的库

您需要两个主要库:Requests 和 BeautifulSoup4。

  1. 要求 用于获取网页。
  2. 美汤4 用于解析网页的HTML内容。

在终端或命令提示符中运行以下命令来安装这些库:

1
2
点安装请求
点安装beautifulsoup4

这些将允许您向网站发送 HTTP 请求并解析 HTML 内容以进行数据提取。

创建你的项目

现在您已经安装了库,是时候设置您的项目了。创建一个新目录,将 Python 脚本放在其中。例如,创建一个名为 beautifulsoup_scraping 的文件夹:

1
2
MKDIR beautifulsoup_scraping
cd beautifulsoup_scraping

这将使您的网页抓取项目井然有序,随时可用。现在,您可以开始使用 BeautifulSoup 进行抓取了。

理解 HTML 和 DOM

在使用 BeautifulSoup 开始网页抓取之前,您需要了解网页的结构。网页使用 HTML(超文本标记语言)构建,并使用 CSS 设置样式。DOM(文档对象模型)是网页的对象树结构,这使得导航和提取信息更加容易。

什么是 DOM?

DOM 是 HTML 文档的树。它嵌套内容。树中的每个节点都是一个元素,可以是标签(如 <p>, <div>, <a>) 或内容(这些标签内的文本)。 DOM 结构是 BeautifulSoup 等网页抓取工具用来从网页中提取数据的工具。

例如,在一个简单的 HTML 文档中,您可能有:

1
2
3
4
5
6
7
<HTML>
<身体>
<h1>欢迎来到我的网站</h1>
<p>这是一段文字。</p>
<a HREF=“https://example.com”>点击这里</a>
</身体>
</HTML>

在这种情况下,DOM 将具有以下节点: <html>, <body>, <h1>, <p><a> 元素,每个元素都包含其相应的内容。

BeautifulSoup 如何与 HTML 交互

BeautifulSoup 使用 DOM 来解析 HTML 并创建 Python 对象树。因此,您可以浏览结构并获取所需的数据。BeautifulSoup 将自动选择系统中可用的最佳解析器,以便您可以立即开始。

当您将 HTML 加载到 BeautifulSoup 中时,它会变成一个对象树。然后,您可以使用各种方法来查找元素或标签、提取内容以及操作数据。

例如,要找到所有

标签(段落),您可以使用:

1
汤.find_all('p')

这将帮助您专注于网页的特定部分,从而使抓取变得更加高效和有针对性。

通过了解 HTML 和 DOM,您可以更好地浏览网页并仅抓取您需要的内容。

使用 BeautifulSoup 进行网页抓取

现在您已经对 HTML 和 DOM 有了基本的了解,是时候开始使用 BeautifulSoup 抓取数据了。BeautifulSoup 通过解析 HTML 或 XML 文档并将其转换为 Python 对象,可以轻松地从网页中提取信息。

解析 HTML

首先,您需要加载网页内容。您可以使用请求来获取网页的 HTML。获得 HTML 后,BeautifulSoup 将接管并为您解析它。

下面展示了如何使用 BeautifulSoup 加载和解析 HTML:

1
2
3
4
5
6
7
8
9
 bs4 进口 美丽汤
进口 要求

# 获取页面
网址= 'https://example.com'
响应 = requests.get(url)

# 解析 HTML 内容
汤 = BeautifulSoup(response.text, 'html.parser')

此后,您就可以使用 BeautifulSoup 强大的功能开始导航并从页面提取数据。

使用提取数据 find()find_all()

BeautifulSoup 提供了几种从页面中搜索和提取元素的方法。最常用的两种方法是 find()find_all().

  • find():此方法搜索文档并返回符合搜索条件的第一个匹配项。当您知道只有一个元素要提取时,此方法很有用。
1
2
标题=汤.find('h1')  # 查找第一个标签
打印(标题.文本)
  • find_all():此方法将所有匹配的元素作为列表返回。当您想要提取多个元素(例如所有链接或页面上的所有段落)时,此方法非常有用。
1
2
3
段落 = soup.find_all('p')  # 查找全部标签
p in 段落:
打印(页文)

这两种方法都可以使用属性来缩小搜索范围。例如,您可以在标签内搜索特定的类或 ID。

1
2
# 查找特定类别
链接=汤.find_all('一种', 类_=‘按钮’)

BeautifulSoup 不仅允许您搜索标签,还允许您浏览标签并访问特定属性。每个 HTML 元素都有提供附加信息的属性,例如 href 对于链接, src 对于图像,以及 alt 用于图像描述。

要访问属性,请使用 ['attribute_name'] 语法。例如:

1
2
3
# 获取第一个链接的 href 属性
first_link = soup.find('一种')
打印(第一个链接['href'])

您还可以使用嵌套搜索来查找其他标签内的标签。当您需要获取 div 或列表等容器内部内容时,这非常有用。

1
2
3
# 查找全部特定内的标签
div_section = soup.find('div', 类_='内容')
段落 = div_section.find_all('p')

使用这些工具,您可以获取和处理任何网页的数据。BeautifulSoup 的灵活性和简单性使其成为网页抓取的理想选择。

5. 创建你的第一个网页抓取脚本

现在您已经知道如何使用 BeautifulSoup 解析和获取数据,让我们将其付诸实践。在本节中,我们将逐步构建完整的网页抓取脚本。

分步脚本示例

让我们了解创建一个简单的网页抓取脚本来从网页获取数据的过程。

  1. 导入库:您需要导入 requests 获取网页并使用 BeautifulSoup 解析其 HTML。
  2. 获取网页: 使用 requests 获取对网站的 HTTP GET 请求。
  3. 解析 HTML: 使用 BeautifulSoup 解析 HTML。
  4. 提取所需数据: 使用 find() or find_all() 提取文本、链接或图像。

这是一个完整的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
进口 要求
bs4 进口 美丽汤

# 步骤 1:定义目标 URL
网址= 'http://quotes.toscrape.com'

# 步骤 2:获取网页
响应 = requests.get(url)

# 步骤 3:解析 HTML 内容
if 响应.status_code == 200:
汤 = BeautifulSoup(response.text, 'html.parser')

# 步骤 4:提取引文和作者
引号 = soup.find_all('跨度', 类_='文本')
作者 = soup.find_all('小的', 类_='作者')

# 打印提取的数据
i in 范围(LEN(引号)):
打印(f”引用: {引号[i].文本}")
打印(f”作者: {作者[i].文本}\n")
其他:
打印(“无法获取网页。”)

从网站抓取数据

我们来看看上面的脚本:

  1. 目标网址: 我们正在使用 http://quotes.toscrape.com,其中有一些要抓取的示例数据。
  2. 获取页面: requests.get() 获取页面的 HTML。我们检查响应代码以查看请求是否成功。
  3. 使用 BeautifulSoup 进行解析:BeautifulSoup将HTML文本解析为解析树。
  4. 提取数据:
  • find_all() 找到所有 <span> 标签与类文本一起获取引文。
  • find_all() 找到所有 <small> 带有类的标签 author 获取作者的姓名。
  1. 打印结果for 循环遍历引文和作者并打印它们。

运行脚本

将脚本另存为 scraper.py 并使用以下命令运行:

1
蟒蛇 scraper.py

预期产量:

1
2
3
4
5
引用: “我们所创造的世界是我们思考的过程。不改变我们的思维,世界就无法改变。”
作者: Albert Einstein

引用: “没有阳光的日子就像夜晚一样。”
作者: 史蒂夫·马丁

此脚本是任何 BeautifulSoup 网页抓取项目的良好起点。从这里,您可以添加更多功能,例如处理分页、将数据保存到文件或抓取更复杂的网站。

通过以下步骤,您可以使用 BeautifulSoup 和 Python 从任何网页提取数据。

处理网页抓取中的常见问题

在进行网页抓取时,人们很可能会遇到问题。网站可能无法正常工作;页面可能在 JavaScript 的帮助下加载;数据可能位于不同的页面上。在本节中,我们将了解如何利用 BeautifulSoup 和其他工具处理这些问题。

1.处理错误

网络抓取过程中错误随处可见,但可以进行处理:

  • HTTP 错误:每次页面由于某种形式的错误而无法访问时,它都会返回 HTTP 状态代码,如 404(未找到)或 500(服务器错误)。脚本应使用错误预防技术,以免将除 200 以外的任何状态代码视为问题。

示例:

1
2
3
4
5
响应 = 请求.get('http://example.com')
if 响应.status_code == 200:
打印(“页面获取成功!”)
其他:
打印(f“获取页面失败。状态代码: {响应.status_code}")
  • 缺少元素:有时,您想要抓取的元素并不存在于页面上。因此,在提取任何数据之前,最好设置一个条件来检查输出中是否缺少这些元素。

示例:

1
2
3
4
5
元素 = 汤.查找('div', 类_='数据')
if 元件:
打印(元素.文本)
其他:
打印(“未找到元素。”)

2. 管理动态内容

有些网站在页面加载后通过 JavaScript 加载内容。在这种情况下,您抓取的静态 HTML 可能不包含您想要的数据。

解决方案: 使用 VHDL 语言编写 or 剧作家 因为它们是可以加载动态内容的浏览器自动化工具。

以 Selenium 为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
进口 网络驱动
selenium.webdriver.common.by 进口 By
selenium.webdriver.support.ui 进口 网络驱动程序等待
selenium.webdriver.support 进口 预期条件 as EC
bs4 进口 美丽汤

# 启动浏览器
驱动程序 = webdriver.Chrome()
驱动程序.get('http://example.com')

# 等待特定元素加载(例如,id="content" 的元素)
尝试:
WebDriver等待(驱动程序, 10)。直到(
EC.presence_of_element_ located((By.ID, '内容'))
)
# 解析页面
汤 = BeautifulSoup (驱动程序。page_source, 'html.parser')
打印(汤.标题.文本)
最后:
# 关闭浏览器
驱动程序.quit()

这使您可以像普通用户一样与动态页面进行交互。

3.处理分页

网站将数据拆分到多个页面,例如博客文章或产品列表。要从网站中提取所有内容,您需要通过浏览每个页面来处理分页。

解决方案: 找到下一页链接并循环播放,直到到达末尾。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
进口 要求
bs4 进口 美丽汤

网址= 'http://quotes.toscrape.com/page/1/'

网址:
响应 = requests.get(url)
汤 = BeautifulSoup(response.text, 'html.parser')

# 提取引文
报价 in 汤.find_all('跨度', 类_='文本'):
打印(引文.文本)

# 找到“下一页”链接
下一页 = soup.find(‘礼’, 类_='下一个')
url = 下一页.a['href'] if 下一页 其他 没有
if 网址:
网址= 'http://quotes.toscrape.com' + 网址

在此脚本中:

  • 这款 while 循环遍历每个页面并提取引文。
  • 这款 next 链接被动态检测并附加到基本 URL。

4. 避免被阻止

过于积极地抓取网站内容会导致您被封禁。以下是避免这种情况的方法:

  • 添加延误: 使用 time.sleep() 在请求之间暂停。
  • 轮换用户代理:发送具有不同用户代理标头的请求以模拟真实浏览器。
  • 使用代理:使用代理服务器通过多个 IP 地址路由请求。Crawlbase 还具有 Smart Proxy 该服务速度超快,易于集成,并且采用按使用量付费的定价模式,价格合理。

通过解决这些常见的网络抓取难题,您将使您的 BeautifulSoup 脚本更加强大和可靠。无论是处理错误、管理动态内容还是避免速率限制,这些技巧都将使您的抓取项目顺利运行。

道德网络抓取实践

网页抓取应以负责任的方式进行,以免损害网站及其服务器。以下是应遵循的道德规范:

1. 遵守网站条款和条件

在抓取网站内容之前,请务必检查条款和条件或 robots.txt 文件。此文件会告诉您哪些内容可以抓取,哪些内容不能抓取。

  • 检查机器人.txt:它定义了网站的哪些部分可以被抓取。
  • 请求权限:如果不确定,请向网站所有者请求抓取的许可。

2.避免服务器过载

过快发送过多请求会导致服务器超载。这会影响网站性能和用户体验。

  • 速率限制: 在请求之间使用延迟以避免服务器过载。
  • 尊重 API 限制: 如果网站有 API,请使用它,而不是直接抓取网站内容。

示例:

1
2
进口
时间.睡眠(2) # 在请求之间添加 2 秒延迟

通过遵循这些做法,您将成为一名负责任的网络抓取者。

总结

BeautifulSoup 非常适合网页抓取。您可以轻松地从 HTML 和 XML 文档中提取数据。无论您是为了分析、研究还是任何其他项目而进行抓取,它都是与网页内容交互的一种简单而有效的方法。

抓取时必须遵守网站规则,不要让服务器超载。通过学习如何负责任地、充分地使用 BeautifulSoup,您可以创建高效且合乎道德的网页抓取脚本。

通过实践,您可以学习更多高级技术来增强您的网页抓取项目。务必检查网站的条款,正确处理数据,并注意性能,以充分利用您的网页抓取体验。

常见问题

问:什么是使用 BeautifulSoup 进行网页抓取?

使用 BeautifulSoup 进行 Web 抓取涉及使用 BeautifulSoup Python 库从 Web 收集信息。它有助于解析 XML 或 HTML 文档,并允许用户浏览内容以查找和检索所需信息,例如文本、图像或链接。

在大多数情况下,网页抓取是合法的,但这取决于网站以及您如何使用数据。请务必查看网站的服务条款和 robots.txt 文件,以确保您没有违反任何规则。切勿以侵犯隐私或使服务器过载的方式进行抓取。

问:抓取时如何处理动态内容?

动态内容是由 JavaScript 加载的内容,因此很难用 BeautifulSoup 抓取。要抓取动态内容,您可能需要使用 Selenium 或 Puppeteer 等其他工具,这些工具可以模拟浏览器操作并在抓取内容之前加载 JavaScript。