我们使用联盟链接。它们让我们能够维持运营,而您无需承担任何费用。

使用 Beautiful Soup 进行网页抓取:面向 Python 初学者的简易教程

使用 Beautiful Soup 进行网页抓取的分步指南。

使用美丽汤进行网页抓取
Python 是一种流行的编程语言,用于构建网站、应用程序和网页抓取。它有许多用于提取和构造大量数据的库和框架。其中之一是 Beautiful Soup – 一个用于解析原始 HTML 数据的库。在本指南中,您将了解为什么应该为您的网页抓取项目选择 Beautiful Soup,您需要哪些其他 Python 网页抓取库才能获得完整的网页抓取体验,以及在哪里练习您的网页抓取技能。您还将找到有关如何使用 Beautiful Soup 构建网页抓取器的分步教程。

什么是使用 Beautiful Soup 进行网页抓取?

网页抓取 使用 Beautiful Soup 进行网页抓取的过程是从您下载的 HTML 代码中提取数据并构建结果以供进一步使用的过程。本质上,Beautiful Soup 是一个构建 HTML 和 XML 页面的 Python 库。它的工作原理是选择您需要的数据并以易于阅读的格式提取数据。例如,您会获得一个 HTTP 客户端(如 Requests),它会为您获取目标网页。然后,您可以创建一个 Beautiful Soup 对象,它允许您浏览目标页面。您可以提取 HTML 标签或属性以及其中的任何内容,并以 CSV 或 JSON 等格式获取结果。因此,从技术上讲,使用 Beautiful Soup 进行网页抓取的过程称为 网络解析

为什么选择Beautiful Soup进行网页抓取?

选择Beautiful Soup有几个很好的理由:
  • 易于使用。 即使你不熟悉 Python 编程语言,学习 Beautiful Soup 也不难。只需几行代码,你就可以构建一个基本的抓取工具,并将目标数据构造成可读的格式。
  • 强大的解析能力。 Beautiful Soup 带有三个内置 HTML 解析器(html.parser、HTML5lib 和 lxml),因此您可以充分利用其中任何一个。例如,HTML5lib 灵活性极佳,而 lxml 速度极快。
  • 轻资源。 解析器不需要太多的计算能力,这使得 Beautiful Soup 比许多其他库更快。
  • 适用于破损页面。 有时网页写得很糟糕,或者 HTML 有问题。与 Selenium 等其他库不同,Beautiful Soup 仍然可以为您提供准确的结果并自动检测页面编码。
  • 大型社区。 Beautiful Soup 是一个拥有数百万用户的开源库,因此您不会缺少 StackOverflow 或 Discord 频道的支持。

构建精美汤品网页爬虫的步骤

假设您想使用 Beautiful Soup 开始网页抓取。这两个步骤将帮助您编写第一个脚本。

步骤 1:选择用于下载页面的网页抓取工具

Beautiful Soup 是一个功能强大的解析器,但它本身无法获取数据或处理动态内容。这就是为什么你需要使用其他 Python 网页抓取库 构建一个功能齐全的抓取工具。首先,您需要一个 HTTP 客户端来下载网页。有多个选项可用,例如 Requests、urllib3 或 aiohttp。如果您不熟悉其中任何一个,请坚持使用 Requests。它易于使用,您只需几行代码即可构建一个简单的网页抓取工具。该库也非常可定制 - 它支持自定义标头、cookie 和处理重定向。如果您需要抓取动态内容,您应该研究一下 无头浏览器库 比如 Selenium。如今,很多网络都使用 JavaScript 来加载内容。在这种情况下,像 Requests 这样的简单 HTTP 客户端将无法处理像 Twitter 或 Reddit 这样的客户端呈现的网站。第三,如果你认真对待你的项目,你应该让自己 旋转代理 绕过 IP 地址封锁。它们是更改您的 IP 和位置的中间服务器。

第 2 步:选择网站并查看网页抓取指南

现在你已经准备好了库,你需要选择一个网站来抓取。你可以选择两种方式:1) 使用虚拟网站练习或 2) 抓取亚马逊或谷歌等真实目标。有几个网站为练习网页抓取技能提供了安全的环境。这些网站是公开的,可以抓取而不会侵犯版权或隐私法。你可以选择 我们推荐的沙盒列表 找到最适合您的项目。如果您没有特定的项目,可以参考我们的指南 多种 Python 理念 适合初学者和高级用户。但是,抓取真实目标具有挑战性——网站管理员使用反机器人措施,如果不小心,可能会中断您的抓取工具。这些措施包括 IP 地址拦截、CAPTCHA 和其他 网页抓取障碍。最重要的是,始终尊重您正在抓取的网站 - 遵守 robots.txt 说明,避免发送过多请求,并且不要抓取登录后的数据(这可能会导致严重的法律问题)。您可以在我们的列表中找到更多提示 网络抓取的最佳实践。

Beautiful Soup 网页抓取:分步教程

想象一下,你是一个旅行者,想要通过获取来自以下国家/地区的列表来计划下一次旅行: Scrapethissite.com。手动收集这些信息可能非常累人。在本 Beautiful Soup 网页抓取教程中,您将构建一个抓取工具来完成所有工作。
scrapethissite
Scrapethissite 网页。
在本教程中,您将学习如何从单个静态页面中提取所有数据并将其添加到 CSV 文件中以供进一步分析。准备好使用 Beautiful Soup 探索世界吧!

硬件需求

  • Python 3。 通常,您的计算机上已经安装了最新版本。如果没有,请从 Python.org.
  • 要求。 你可以写 pip install requests 在您的操作系统终端中。
  • 美丽的汤。 通过运行添加 pip install beautifulsoup4.
  • 代码编辑器。 您可以选择任何您喜欢的代码编辑器:Visual Studio Code、Notepad++ 或您操作系统的文本编辑器。
如果您在 Windows 10 上安装 Beautiful Soup 时遇到问题,可以参考以下教程获取指导:

一步一步的教程,展示如何在 Windows 10 上设置 Beautiful Soup

导入库

导入 Beautiful Soup 和 Requests 库。

				
					from bs4 import BeautifulSoup
import requests
				
			

此外,导入 csv 库以将数据导出到 CSV 文件。

				
					import csv

				
			

获取 HTML 内容

现在,获取包含世界所有国家的 Scrapethissite 页面。

				
					url="http://www.scrapethissite.com/pages/simple/"
response=requests.get(url)
				
			

使用 Beautiful Soup 解析 HTML

让我们继续构建数据,为您下载的页面创建一个 Beautiful Soup 对象。它将允许您访问您想要获取的所有信息。

				
					soup = BeautifulSoup(response.content, 'html.parser')

				
			

现在您已经有了解析后的 H​​TML 内容,您可以开始寻找要提取的数据点。在本例中,让我们抓取国家名称、首都、人口和面积。

要查找元素,只需右键单击页面上的任意位置,然后按 检查 或使用快捷键 Ctrl + Shift + I。如您所见,所有数据都在 DIV 在下面  国家。

检查元素
步骤 1。 首先,缩小搜索范围,只抓取每个国家/地区行的数据,而不是所有行的数据。您可以使用 找到所有() 方法与类调用 国家这样,您就会知道所有属于国家 div 的元素都将成为其子元素。
				
					divs = soup.find_all("div", class_="country")

				
			

如果您的目标网站包含图像,您可以按类别定位元素。

展示如何抓取图像的分步指南。

您可以通过查找 HREF 属性。

有关如何提取 URL 元素的分步教程。

步骤 2。 如果您想写入 csv 文件,则需要创建一个带有元素的字典来存储信息。

				
					countries_dict = []

				
			

步骤 3。 现在,让我们循环遍历行中的每个元素,从每个 div 中提取国家名称、首都、人口和面积以及我们已经抓取的国家类别。

				
					for div in divs:

				
			

请注意,有些值为空(或缺失),因此您需要处理错误以将空字符串分配给相应的变量。

获取所有这些信息的一种方法是使用 BeautifulSoup 找() 功能并通过标签和类别选择每个元素。

美丽的汤输出

1)让我们用类提取 h3 标签中的国家名称 国家的名字.

				
					    country_elem = div.find("h3", class_="country-name")
    if country_elem is not None:
        country = country_elem.text.strip()
    else:
        country = ""
				
			

2)现在,获取带有类的 span 标签中的大写名称 国家首都.

				
					    capital_elem = div.find("span", class_="country-capital")
    if capital_elem is not None:
        capital = capital_elem.text.strip()
    else:
        capital = ""
				
			

3)你可以找到属于以下类别的人口 国家人口.

				
					    population_elem = div.find("span", class_="country-population")
    if population_elem is not None:
        population = population_elem.text.strip()
    else:
        population = ""
				
			

4)然后,重复相同的操作,从 国家地区.

				
					    area_elem = div.find("span", class_="country-area")
    if area_elem is not None:
        area = area_elem.text.strip()
    else:
        area = ""
				
			

步骤 4。 最后,打印结果以查看您的代码是否有效。

				
					    print(country, capital, population, area)

				
			

这是输出:

美丽的汤输出

将数据写入 CSV

尽管您刚刚抓取了所有必要的信息,但它看起来仍然太乱,无法进行进一步分析。我们将所有内容导出到 Excel 电子表格中。

步骤 1。 将抓取的国家信息添加到字典中。

				
					    countries_dict.append({
        "name": country,
        "capital": capital,
        "population": population,
        "area": area,
    })
				
			

步骤 2。 打印出这本字典。

				
					print (countries_dict)

				
			
打印出字典

步骤 3。 按照您希望它们在 csv 中出现的顺序写下您的字典字段名称。

				
					field_names = ["name", "capital", "population", "area"]

				
			

步骤 4。 为您的输出创建一个文件名。

				
					output_filename = "country_info.csv"

				
			

步骤 5。 打开该文件并设置编码。然后使用 csv 库写入它。

				
					with open (output_filename, 'w', newline='', encoding="utf-8") as f_output:
    writer = csv.DictWriter(f_output, fieldnames = field_names)
    writer.writeheader()
    writer.writerows(countries_dict)
				
			

就这样。您在 CSV 文件中获得了结构良好的结果。

beautiful-soup-csv

以下是完整脚本:

				
					from bs4 import BeautifulSoup
import requests
import csv

url="http://www.scrapethissite.com/pages/simple/"
response=requests.get(url)

soup = BeautifulSoup(response.content, 'html.parser')

# fnd all country rows instead of all rows
divs = soup.find_all("div", class_="country")


# we need an element to store info to csv
# creating a dictionary for that

countries_dict = []

# looping through the rows
for div in divs:
    country_elem = div.find("h3", class_="country-name")
    if country_elem is not None:
        country = country_elem.text.strip()
    else:
        country = ""

    capital_elem = div.find("span", class_="country-capital")
    if capital_elem is not None:
        capital = capital_elem.text.strip()
    else:
        capital = ""

    population_elem = div.find("span", class_="country-population")
    if population_elem is not None:
        population = population_elem.text.strip()
    else:
        population = ""

    area_elem = div.find("span", class_="country-area")
    if area_elem is not None:
        area = area_elem.text.strip()
    else:
        area = ""

    # printing the results
    print(country, capital, population, area)
    
    # adding the scraped country info to a dictionary

    countries_dict.append({
        "name": country,
        "capital": capital,
        "population": population,
        "area": area,
    })

# printing out the dictionary
print (countries_dict)

# write field names of your dictionary in the order you want them to appear in the csv
field_names = ["name", "capital", "population", "area"]

# filename for your output csv
output_filename = "country_info.csv"

# opening the file to write and setting the encoding, then writing to it using the csv library
with open (output_filename, 'w', newline='', encoding="utf-8") as f_output:
    writer = csv.DictWriter(f_output, fieldnames = field_names)
    writer.writeheader()
    writer.writerows(countries_dict)
				
			

使用 Beautiful Soup 进行高级网页抓取

如果你想尝试其他沙盒,你可以去 刮擦 并尝试提取一些书名、价格、库存数据、作者和其他信息。您可以参考我们关于使用 Python 进行 Web 抓取的分步教程。

使用 Python 进行网页抓取:入门所需的一切。

现在您已经知道如何抓取单个网页,您还应该练习其他网页抓取技能。您不会在沙箱中抓取很长时间,而且像 Amazon 或 eBay 这样的网站拥有大量数据,无法在一个页面中容纳。

Scrapethissite 提供了自 1990 年以来 NHL 冰球队的详尽统计数据列表!因此,现在是时候处理分页了 - 抓取多个页面。以下是指导教程:

有关如何使用 Beautiful Soup 提取多个网页的分步教程。

但这并不是网页隐藏的唯一挑战——所有数据都嵌套在表格中。抓取表格非常有用,尤其是当您对股票或其他数字感兴趣时。但别担心,我们也会为您提供帮助。

一步一步的教程展示如何使用 Beautiful Soup 提取表格。

如今,现代网站的页面中包含许多复杂元素,但 Beautiful Soup 能够处理其中的大部分元素。如果您想掌握此解析器,您可以在我们的 知识库。

Adam Dubois 的图片
亚当·杜波依斯
代理极客和开发人员。