使用 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 网页抓取教程中,您将构建一个抓取工具来完成所有工作。
硬件需求
- Python 3。 通常,您的计算机上已经安装了最新版本。如果没有,请从 Python.org.
- 要求。 你可以写
pip install requests在您的操作系统终端中。 - 美丽的汤。 通过运行添加
pip install beautifulsoup4. - 代码编辑器。 您可以选择任何您喜欢的代码编辑器:Visual Studio Code、Notepad++ 或您操作系统的文本编辑器。
一步一步的教程,展示如何在 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')
现在您已经有了解析后的 HTML 内容,您可以开始寻找要提取的数据点。在本例中,让我们抓取国家名称、首都、人口和面积。
要查找元素,只需右键单击页面上的任意位置,然后按 检查 或使用快捷键 Ctrl + Shift + I。如您所见,所有数据都在 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 文件中获得了结构良好的结果。
以下是完整脚本:
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 能够处理其中的大部分元素。如果您想掌握此解析器,您可以在我们的 知识库。