写点什么

如何为你的机器学习项目抓取网页数据?

2021 年 7 月 19 日

如何为你的机器学习项目抓取网页数据?

前不久,我在 LearnML 子论坛上看到一篇帖子。楼主在这篇帖子中提到,他需要为自己的机器学习项目抓取网页数据。很多人在回帖中给出了自己的方法,主要是学习如何使用 BeautifulSoup 和 Selenium。

 

我曾在一些 数据科学项目中使用过 BeautifulSoup 和 Selenium。在本文中,我将告诉你如何用一些有用的数据抓取一个网页,并将其转换成 pandas 数据结构(DataFrame)。

 

为什么要将其转换成数据结构呢?这是因为大部分机器学习库都能处理 pandas 数据结构,并且只需少量修改就可对你的模型进行编辑。

 

首先,我们要在维基百科上找到一个表来转换成数据结构。我抓取的这张表,展示的是维基百科上浏览量最大的运动员数据。



其中一项大量的工作就是,通过浏览 HTML 树来得到我们需要的表。



通过 request 和 regex 库,我们开始使用 BeautifulSoup。


from bs4 import BeautifulSoupimport requestsimport reimport pandas as pd
复制代码

 

下面,我们将从网页中提取 HTML 代码:

 

website_url = requests.get('https://en.wikipedia.org/wiki/Wikipedia:Multiyear_ranking_of_most_viewed_pages').textsoup = BeautifulSoup(website_url, 'lxml')print(soup.prettify())</a></li><li id="footer-places-disclaimer"><a href="/wiki/Wikipedia:General_disclaimer" title="Wikipedia:General disclaimer">Disclaimers</a></li><li id="footer-places-contact"><a href="//en.wikipedia.org/wiki/Wikipedia:Contact_us">Contact Wikipedia</a></li><li id="footer-places-mobileview"><a class="noprint stopMobileRedirectTog
复制代码

 

从语料库中收集所有的表,我们有一个较小的表面区域来搜索。

 

wiki_tables = soup.find_all('table', class_='wikitable')wiki_tables
复制代码

 

因为存在很多表,所以需要一种过滤它们的方法。

 

据我们所知,Cristiano Ronaldo(也就是葡萄牙足球运动员 C 罗)有一个锚标记,这可能在几个表中是独一无二的。


通过 Cristiano Ronaldo 文本,我们可以过滤那些被锚标记的表。此外,我们还发现一些包含这个锚标记的父元素。

 

links = []for table in wiki_tables:_table = table.find('a', string=re.compile('Cristiano Ronaldo'))if not _table:continueprint(_table)_parent = _table.parentprint(_parent)links.append(_parent)<a href="/wiki/Cristiano_Ronaldo" title="Cristiano Ronaldo">Cristiano Ronaldo</a><td style="text-align: left;"><a href="/wiki/Cristiano_Ronaldo" title="Cristiano Ronaldo">Cristiano Ronaldo</a></td><a href="/wiki/Cristiano_Ronaldo" title="Cristiano Ronaldo">Cristiano Ronaldo</a><td style="text-align: left;"><a href="/wiki/Cristiano_Ronaldo" title="Cristiano Ronaldo">Cristiano Ronaldo</a></td><a href="/wiki/Cristiano_Ronaldo" title="Cristiano Ronaldo">Cristiano Ronaldo</a><td style="text-align: left;"><a href="/wiki/Cristiano_Ronaldo" title="Cristiano Ronaldo">Cristiano Ronaldo</a></td>
复制代码

 

父元素只显示单元格。


这是一个带有浏览器 web 开发工具的单元格。

 


parent_lst = []for anchor in links:   _ = anchor.find_parents('tbody')   print(_)   parent_lst.append(_)
复制代码


利用 tbody,我们可以返回包含以前的锚标记的其他表。

 

为进一步过滤,我们可以在以下表中的不同标题进行搜索:

 

for i in parent_lst:   print(i[0].find('tr'))tr><th>Rank*</th><th>Page</th><th>Views in millions</th></tr><tr><th>Rank</th><th>Page</th><th>Views in millions</th></tr><tr><th>Rank</th><th>Page</th><th>Sport</th><th>Views in millions</th></tr>
复制代码

 

第三张看起来很像我们所需要的表。


接下来,我们开始创建必要的逻辑来提取并清理我们需要的细节。

 

sports_table = parent_lst[2]
complete_row = []
for i in sports_table: rows = i.find_all('tr') print('\n--------row--------\n') print(rows)
for row in rows: cells = row.find_all('td') print('\n-------cells--------\n') print(cells)
if not cells: continue
rank = cells[0].text.strip('\n') page_name = cells[1].find('a').text sport = cells[2].find('a').text views = cells[3].text.strip('\n')
print('\n-------CLEAN--------\n') print(rank) print(page_name) print(sport) print(views)
complete_row.append([rank, page_name, sport, views]) for i in complete_row: print(i)
复制代码


分解一下:

 

sports_table = parent_lst[2]complete_row = []
复制代码

 

下面我们从上面的列表中选择第三个元素。这就是我们需要的表。

 

接下来创建一个空列表,用于存储每行的详细信息。在遍历这个表的时候,建立一个循环,遍历表中的每一行,并将其保存到 rows 变量中。

 

for i in sports_table:  rows = i.find_all('tr')  print('\n--------row--------\n')  print(rows)
复制代码

 


for row in rows:   cells = row.find_all('td')   print('\n-------cells--------\n')   print(cells)
复制代码

 

建立了嵌套的循环。遍历上一个循环中保存的每个行。在遍历这些单元格时,我们将每个单元格保存在一个新的变量。

 


if not cells:  continue
复制代码

 

这段简短的代码允许我们在从单元格中提取文本时,避免空单元格并防止发生错误。

 

rank = cells[0].text.strip('\n')page_name = cells[1].find('a').textsport = cells[2].find('a').textviews = cells[3].text.strip('\n')
复制代码

 

在此,我们将各种单元格清理为纯文本格式。清除后的值保存在其列名下的变量中。

 

print('\n-------CLEAN--------\n')print(rank)print(page_name)print(sport)print(views)complete_row.append([rank, page_name, sport, views])
复制代码

 

此处,我们向行列表添加这些值。然后输出清理后的值。

 

-------cells--------[<td>13</td>, <td style="text-align: left;"><a href="/wiki/Conor_McGregor" title="Conor McGregor">Conor McGregor</a></td>, <td><a href="/wiki/Mixed_martial_arts" title="Mixed martial arts">Mixed martial arts</a></td>, <td>43</td>]-------CLEAN--------13Conor McGregorMixed martial arts43
复制代码

 

下面将其转换为数据结构:

 

headers = ['Rank', 'Name', 'Sport', 'Views Mil']df = pd.DataFrame(complete_row, columns=headers)df
复制代码

 


现在你可以在机器学习项目中使用的 pandas 数据结构了。你可以使用自己喜欢的库来拟合模型数据。

 

作者介绍:

 

Tobi Olabode,对技术感兴趣,目前主要关注机器学习。

 

原文链接:

 

https://blog.devgenius.io/how-to-scrape-a-website-for-your-ml-project-c3a4d6f160c7

2021 年 7 月 19 日 15:3131

评论

发布
暂无评论
发现更多内容

一个DNS引发的“血案”

穿过生命散发芬芳

Wireshark 数据包分析 4月日更

你真的懂反馈吗?

石云升

28天写作 职场经验 管理经验 4月日更

TcaplusDB君 · 行业新闻汇编(4月9日)

TcaplusDB

数据库 nosql 后端 TcaplusDB

聪明人的训练(九)

Changing Lin

4月日更

翻译:《实用的Python编程》08_01_Testing

codists

Python

新的物联网技术应用有哪些

cdhqyj

互联网 物联网 通信 计算机

【得物技术】算法入门一:算法的好坏?复杂度告诉你

得物技术

算法 时间复杂度 前端 入门 复杂度

JavaScript小笔记

赫鲁小夫

4月日更

Redis 最后一课

escray

redis 极客时间 学习笔记 Redis 核心技术与实战 4月日更

那束漂亮的手捧花

小天同学

爱情 4月日更 幸福 传递

IPFS挖矿如何赚钱?IPFS挖矿怎么解锁释放?

投资矿机v:IPFS1234

IPFS挖矿如何赚钱 IPFS挖矿怎么解锁释放

在业务高峰期拔掉服务器电源是一种怎样的体验?

冰河

分布式 微服务 数据恢复 MySQL 高可用 异常处理

Web安全攻防与渗透测试实战 学习笔记

Machine Gun

网络安全 信息安全 渗透测试 WEB安全

我的 2015-2018 —— 银行软开三年项目回顾

清秋

前端 重构 鉴权 4月日更

各大厂封杀!全到百分之百必中的金三银四面试突击指南太强了!

Java王路飞

Java 程序员 架构 面试 分布式

调整云计算资源大小时要避免的10个错误

浪潮云

云计算

游戏数据埋点

data_y

游戏 数据埋点 游戏数据分析 埋点定义

每天学一个 Linux 命令:zcat

Machine Gun

linux操作

阿里巴巴2021年Java程序员面试指导小册泰山版震撼来袭!已开源!

Java成神之路

Java 程序员 架构 面试 编程语言

新华三“云屏”发布:云屏融合重塑工作体验,全力构建智“会”时代

DT极客

微服务网关:Spring Cloud Gateway —— Zuul

程序员架构进阶

微服务 网关 28天写作 四月日更 4月日更

还不会JDK源码?阿里P8大牛纯手打:JDK源码剖析笔记

Java成神之路

Java 程序员 架构 面试 编程语言

CIAM的7个基本原则

龙归科技

安全性 用户 业务增长

Android音视频 - MediaCodec编解码音视频

LoveYFan

android 音视频 编解码

FIL矿机在哪里买?FIL矿机多少钱一台?

投资矿机v:IPFS1234

FIL矿机在哪里买 FIL矿机多少钱一台

深入浅出 LVS 负载均衡系列(一):NAT、FULLNAT 模型原理

UCloud技术

负载均衡

Inference Engine情感分类实践

IT蜗壳-Tango

IT蜗壳教学 4月日更

美团四面,侥幸收获offer!面试回顾,不得感叹“真难呀”

Java成神之路

Java 程序员 架构 面试 编程语言

Android音视频 - EGL源码解析以及C++实现

LoveYFan

android 音视频 OpenGL ES

经典递归

山@支

三翼鸟的羽翼下,人诗意地栖居在智能生活里

脑极体

如何为你的机器学习项目抓取网页数据?-InfoQ