从网页抓取数据( soup:如何用一些有用的数据抓取一个网页数据?)
优采云 发布时间: 2022-01-08 12:09从网页抓取数据(
soup:如何用一些有用的数据抓取一个网页数据?)
作者 | 托比·奥拉博德
翻译 | 三菩提
规划 | 凌敏
不久前,我在LearnML 子论坛上看到了一个帖子。楼主在这篇文章中提到,他的机器学习项目需要抓取网络数据。很多人在回复中给出了自己的方法,主要是学习BeautifulSoup和Selenium的使用方法。
我在一些数据科学项目中使用了 BeautifulSoup 和 Selenium。在本文中,我将向您展示如何使用一些有用的数据抓取网页并将其转换为 pandas 数据结构(DataFrame)。
为什么要将其转换为数据结构?这是因为大多数机器学习库都可以处理 pandas 数据结构并以最少的修改来编辑您的模型。
首先,我们将在 Wikipedia 上找到一个表以转换为数据结构。我抓取的这张表显示了维基百科上浏览次数最多的运动员数据。
很多工作都是通过 HTML 树来获取我们需要的表格。
通过 request 和 regex 库,我们开始使用 BeautifulSoup。
从 bs4 导入 BeautifulSoup
导入请求
*敏*感*词*重新
将熊猫导入为 pd
接下来,我们将从网页中提取 HTML 代码:
website_url = requests.get(').text
汤 = BeautifulSoup(website_url, 'lxml')
打印(汤。美化())
免责声明
联系维基百科
从语料库中采集所有表格,我们有一个小的表面积要搜索。
wiki_tables = soup.find_all('table', class_='wikitable')
wiki_tables
因为有很多表,所以需要一种过滤它们的方法。
据我们所知,克里斯蒂亚诺·罗纳尔多(又名葡萄牙足球运动员克里斯蒂亚诺·罗纳尔多)有一个锚标签,这在几张桌子中可能是独一无二的。
使用 Cristiano Ronaldo 文本,我们可以过滤那些由锚点标记的表格。此外,我们还发现了一些收录此锚标记的父元素。
链接= []
对于 wiki_tables 中的表:
_table = table.find('a', string=pile('Cristiano Ronaldo'))
如果不是_table:
继续
打印(_table)
_parent = _table.parent
打印(_父)
links.append(_parent)
克里斯蒂亚诺·罗纳尔多
克里斯蒂亚诺·罗纳尔多
克里斯蒂亚诺·罗纳尔多
克里斯蒂亚诺·罗纳尔多
克里斯蒂亚诺·罗纳尔多
克里斯蒂亚诺·罗纳尔多
父元素仅显示单元格。
这是一个带有浏览器 Web 开发工具的单元。
parent_lst = []
对于链接中的锚点:
_ = anchor.find_parents('tbody')
打印(_)
parent_lst.append(_)
使用 tbody,我们可以返回收录先前锚标记的其他表。
为了进一步过滤,我们可以在下表中的不同标题下进行搜索:
对于 parent_lst 中的 i:
打印(i[0].find('tr'))
tr>
秩*
页
百万浏览量
秩
页
百万浏览量
秩
页
运动
百万浏览量
第三个看起来很像我们需要的表格。
接下来,我们开始创建必要的逻辑来提取和清理我们需要的细节。
sports_table = parent_lst[2]
完成行 = []
对于我在 sports_table 中:
行 = i.find_all('tr')
print('\n--------行--------\n')
打印(行)
对于行中的行:
细胞 = row.find_all('td')
print('\n--------细胞--------\n')
打印(单元格)
如果不是细胞:
继续
rank = cells[0].text.strip('\n')
page_name = 单元格[1].find('a').text
运动 = 细胞[2].find('a').text
视图 = 单元格[3].text.strip('\n')
print('\n--------干净--------\n')
打印(排名)
打印(页面名称)
打印(运动)
打印(视图)
complete_row.append([排名,页面名称,运动,视图])
对于我在 complete_row:
打印(一)
分解它:
sports_table = parent_lst[2]
完成行 = []
接下来,我们从上面的列表中选择第三个元素。这是我们需要的表。
接下来创建一个空列表来存储每一行的详细信息。遍历表时,设置一个循环来遍历表中的每一行并将其保存到 rows 变量。
对于我在 sports_table 中:
行 = i.find_all('tr')
print('\n--------行--------\n')
打印(行)
对于行中的行:
细胞 = row.find_all('td')
print('\n--------细胞--------\n')
打印(单元格)
创建嵌套循环。遍历前一个循环中保存的每一行。在遍历这些单元格时,我们将每个单元格保存在一个新变量中。
如果不是细胞:
继续
这段简短的代码让我们在从单元格中提取文本时避免出现空单元格并防止错误。
rank = cells[0].text.strip('\n')
page_name = 单元格[1].find('a').text
运动 = 细胞[2].find('a').text
视图 = 单元格[3].text.strip('\n')
在这里,我们将各种单元格清理为纯文本。清除的值保存在其列名下的变量中。
print('\n--------干净--------\n')
打印(排名)
打印(页面名称)
打印(运动)
打印(视图)
complete_row.append([排名,页面名称,运动,视图])
在这里,我们将这些值添加到行列表中。然后输出清理后的值。
- - - -细胞 - - - -
[13
, 康纳·麦格雷戈
, 混合武术
, 43
]
- - - -干净的 - - - -
13
康纳麦格雷戈
混合武术
43
以下将其转换为数据结构:
headers = ['Rank', 'Name', 'Sport', 'Views Mil']
df = pd.DataFrame(complete_row, columns=headers)
df
现在,您拥有可以在机器学习项目中使用的 pandas 数据结构。您可以使用自己喜欢的库来拟合模型数据。
关于作者:
Tobi Olabode 对技术感兴趣,目前专注于机器学习。
原文链接:
网页链接
你也在“看”吗?