使用 Beautiful Soup 进行网页抓取
介绍
Web 抓取是从 HTML/XML 内容中提取结构化数据的特定信息的过程。数据科学家和研究人员通常需要从众多网站获取和提取数据,以创建数据集、测试或训练算法、神经网络和机器学习模型。通常,网站会提供API,这是获取结构化数据的最佳方式。但是,有时没有可用的 API,或者您想绕过注册过程。在这种情况下,只能通过网页访问数据。在处理与网站相关的动态数据(如股票、招聘信息、酒店预订、房地产等)时,手动过程可能非常繁琐且耗时,这些数据需要经常访问。Python 通过各种模块提供了一种自动化的方法,可以从网络(URL/URI)获取 HTML 内容并提取数据。本指南将详细介绍使用beautifulsoup模块进行 Web 抓取的过程。
网页抓取流程
抓取过程包括以下步骤:
通过 URL 使用请求模块发出请求。
以文本形式检索 HTML 内容。
仔细检查 HTML 结构以确定要从中提取数据的特定 HTML 元素。为此,请在浏览器中右键单击网页并选择检查选项以查看结构。
在 Safari 中,通过Safari -> 偏好设置 -> 高级 -> 在栏中显示开发菜单启用开发者选项
- 使用BeautifulSoup从响应中查找特定元素并提取文本。
按照Python 中的 Web 请求指南来了解如何使用 Python 发出 Web 请求。
HTML 和 CSS 基础知识
<!DOCTYPE html> --> 1
<html> --> 2
<head> --> 3
<title>List of Game Engines</title>
<style type="text/css"> --> 4
table, th, td{
border: solid 2px black;
border-collapse: collapse;
border-color: lightgrey;
padding: 4px;
}
table th{
color: blue;
font-size: 20px;
}
table td{
color: green;
font-size: 25px;
}
</style>
</head>
<body> --> 5
<div> --> 6
<table align = "center"> --> 7
<tr>
<th>Name</th>
<th>Language</th>
<th>Platform</th>
</tr><br>
<tr>
<td>Unreal Engine</td>
<td>C++</td>
<td>Cross platform</td>
</tr>
</table>
</div>
</body>
</html>
HTML 描述
标签(<tags>)写在菱形括号<>内,可以是成对的(<title>)或不成对的(<br>)
<!DOCTYPE html>标签代表 HTML5 语法,它支持一些新标签,例如nav、header等。
html标签包含HTML内容,也称为根标签。
head包括 CSS 样式代码、JavaScript 代码和元标签。
CSS 用于装饰内容,可以使用样式标签添加。
所有 HTML 渲染的内容都应放在body标签内。
div作为容器来表示屏幕上的某个区域。
table标签用于以表格形式呈现数据。th表示粗体标题列,td表示列,tr表示行。有两行,称为兄弟行。
可以单独创建 CSS 和 JavaScript 文件,并使用链接或脚本标签链接到多个 HTML 页面。
先决条件
Python 拥有丰富的软件包集合,pip工具用于在当前开发环境中管理这些软件包。本指南将使用以下模块:
请求:发出网络请求
Beautiful Soup:从 HTML 响应中提取数据
使用以下pip命令安装所需的包:
pip install beautifulsoup4 requests
使用空格在单个安装语句中提及多个模块
数据提取和清理
抓取的第一步是获取数据。因此,为了演示目的,我们将使用游戏引擎列表页面。让我们打开页面并使用检查选项查看结构。
这将打开开发人员工具窗口,其中将显示 HTML 元素结构。有一个id为bodyContent的div,其中包含所有可见的 HTML 元素,如下所示:
这是包含有关游戏引擎详细信息的表格标签。
每个tr代表列表中的一个条目并包含列条目。
这是光标,它将突出显示网页上的相应元素,这里它突出显示第二行的第一列,即“4A 引擎”标题。
节点提供所选节点的属性,如id、style等。样式提供有关CSS代码的详细信息,图层提供有关重新绘制内容(如图像等)的详细信息。
属性部分显示类的名称,即wikitable sortable jquery-tablesorter,这是为应用于此表的一组 CSS 样式属性赋予的可自定义名称。
抓取脚本
现在我们知道了包含数据的具体 HTML 标签,所以让我们直接开始编写代码。
第一步是导入模块。BeautifulSoup用于抓取数据,Requests用于发出HTTP 请求。
from bs4 import BeautifulSoup # BeautifulSoup is in bs4 package
import requests
发出 HTTP 请求以通过特定 URL 获取 HTML 内容。
URL = 'https://en.wikipedia.org/wiki/List_of_game_engines'
content = requests.get(URL)
创建一个BeautifulSoup对象并定义解析器。
soup = BeautifulSoup(content.text, 'html.parser')
默认解析器是lxml ,与html.parser相比,它更宽松、更快,尽管lxml依赖于平台,而html.parser是 Beautiful Soup 的一部分。
解析器将输入转换为称为标记的单个实体,然后进一步将标记转换为图形或树结构以进行处理。
BeautifulSoup可以提取特定标签的单个或多个出现,也可以接受基于属性的搜索条件,例如:
- 查找:此函数将标签名称作为字符串输入,并从网页响应中返回特定标签找到的第一个匹配项:
row = soup.find('tr') # Extract and return first occurrence of tr
print(row) # Print row with HTML formatting
print("=========Text Result==========")
print(row.get_text()) # Print row as text
- Findall:使用find_all从页面响应中提取特定标签的所有出现情况,如下所示:
rows = soup.find_all('tr')
for row in rows: # Print all occurrences
print(row.get_text())
find_all返回ResultSet的对象,该对象提供基于索引的访问找到的结果,并且可以使用for<font style="vertical-align: inh
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~