从网页抓取数据(用脚本将获取信息上获取2018年100强企业的信息)
优采云 发布时间: 2022-01-04 04:18从网页抓取数据(用脚本将获取信息上获取2018年100强企业的信息)
(点击上方公众号,快速关注,一起学习Python)
编译:Ou Shave
数据科学家的首要任务是进行网络爬虫。那时,我对使用代码从网站获取数据的技术一无所知。它恰好是最合乎逻辑和最简单的数据来源。经过几次尝试,网络爬行对我来说几乎是本能的。今天,它已成为我几乎每天都在使用的少数技术之一。
在今天的文章中,我会用几个简单的例子来给大家展示一下如何爬取一个网站——比如从Fast Track获取2018年排名前100的公司信息。使用脚本实现信息获取过程的自动化,不仅可以节省人工整理的时间,还可以将企业所有数据整理成结构化的文件,以便进一步分析查询。
看版本太长:如果你只是想要一个最基本的Python爬虫程序的示例代码,本文用到的所有代码都在GitHub()上,欢迎大家来取。
准备工作
每次你打算用 Python 做某事时,你问的第一个问题应该是:“我需要使用什么库”。
有几个不同的库可用于网络抓取,包括:
今天我们计划使用 Beautiful Soup 库。您只需要使用 pip(Python 包管理工具)即可轻松将其安装到您的计算机上:
安装完成后,我们就可以开始了!
检查网页
为了确定要抓取网页的哪些元素,首先需要检查网页的结构。
以 Tech Track 前 100 名公司 (%3A//www.fasttrack.co.uk/league-tables/tech-track-100/league-table/) 为例。您可以右键单击表格并选择“考试”。在弹出的“开发者工具”中,我们可以看到页面上的每个元素以及其中收录的内容。
在要查看的网页元素上右击,选择“check”查看具体的HTML元素内容
由于数据是存放在表中的,所以只需要几行代码就可以直接得到完整的信息。如果您想自己练习抓取网页内容,这是一个很好的例子。但请记住,实际情况往往并非如此简单。
在此示例中,所有 100 个结果都收录在同一页面上,并由标签分隔成行。但是,在实际的爬取过程中,很多数据往往分布在多个不同的页面上。您需要调整每个页面显示的结果总数或遍历所有页面以捕获完整数据。
在表格页面,可以看到一个收录全部100条数据的表格,右键点击选择“检查”,可以很容易的看到HTML表格的结构。收录内容的表格的主体在这个标签中:
每一行都在一个标签中,也就是我们不需要太复杂的代码,只要一个循环,就可以读取所有的表数据并保存到文件中。
注意:您还可以通过检查当前页面是否发送了HTTP GET请求并获取该请求的返回值来获取页面显示的信息。因为 HTTP GET 请求往往可以返回结构化数据,例如 JSON 或 XML 格式的数据,以方便后续处理。您可以在开发者工具中点击Network类别(如果需要,您只能查看XHR标签的内容)。这时候可以刷新页面,这样页面上加载的所有请求和返回的内容都会在Network中列出。此外,您还可以使用某种REST客户端(例如Insomnia)发起请求并输出返回值。
刷新页面后,更新Network标签的内容
使用 Beautiful Soup 库处理网页的 HTML 内容
熟悉了网页的结构,了解了需要爬取的内容后,我们终于拿起代码开始工作了~
首先要导入代码中需要用到的各个模块。我们上面已经提到过 BeautifulSoup,这个模块可以帮助我们处理 HTML 结构。下一个要导入的模块是urllib,负责连接目标地址,获取网页内容。最后,我们需要能够将数据写入CSV文件并保存在本地硬盘上,因此我们需要导入csv库。当然,这不是唯一的选择。如果要将数据保存为json文件,则需要相应地导入json库。
接下来,我们需要准备需要爬取的目标网址。如上所述,这个页面已经收录了我们需要的所有内容,所以我们只需要复制完整的 URL 并将其赋值给变量即可:
接下来我们可以使用urllib连接这个URL,将内容保存在page变量中,然后使用BeautifulSoup对页面进行处理,并将处理结果保存在soup变量中:
这时候可以尝试打印soup变量,看看处理后的html数据是什么样子的:
如果变量内容为空或者返回一些错误信息,则表示可能无法正确获取网页数据。您可能需要在 urllib.error() 模块中使用一些错误捕获代码来查找可能的问题。
查找 HTML 元素
由于所有内容都在表格中(
tag),我们可以在soup对象中搜索需要的表,然后使用find_all方法遍历表中的每一行数据。
如果您尝试打印出所有行,则应该有 101 行-100 行内容,加上一个标题。
看看打印出来的内容,如果没有问题,我们可以用一个循环来获取所有的数据。
如果打印出soup对象的前2行,可以看到每一行的结构是这样的:
如您所见,该表共有 8 列,分别为 Rank、Company、Location、Year End、Annual Sales Rise、Latest Sales(今年的销售额)、Staff(员工人数)和 Comments(备注)。
这些是我们需要的数据。
这个结构在整个网页中是一致的(但在其他网站上可能没有这么简单!),所以我们可以再次使用find_all方法通过搜索元素逐行提取数据,就是存储在变量中,以后可以写入 csv 或 json 文件。
遍历所有元素并将它们存储在变量中
在Python中,如果需要处理大量数据,需要写入文件,list对象非常有用。我们可以先声明一个空的列表,填入初始的header(供以后在CSV文件中使用),后面的数据只需要调用list对象的append方法即可。
这将打印出我们刚刚添加到列表对象行中的第一行标题。
您可能会注意到,我输入的标题中的列名称比网页上的表格多几个,例如网页和说明。请仔细看上面打印的汤变量数据——在数据的第二行第二列,不仅有公司名称,还有公司网站和简要说明。所以我们需要这些额外的列来存储这些数据。
接下来,我们遍历所有 100 行数据,提取内容,并将其保存到列表中。
如何循环读取数据:
因为第一行数据是html表格的表头,我们可以跳过阅读。因为header使用了标签,没有使用标签,所以我们简单的查询标签中的数据,丢弃空值。
接下来,我们读取数据的内容并赋值给变量:
如上代码所示,我们将8列的内容依次存入8个变量中。当然,有些数据的内容需要清理,去除多余的字符,导出需要的数据。
数据清洗
如果我们把company变量的内容打印出来,可以发现它不仅收录了公司名称,还收录了include和description。如果我们把sales变量的内容打印出来,可以发现里面还有一些备注等需要清除的字符。
我们想把公司变量的内容分成两部分,公司名称和描述。这可以在几行代码中完成。再看一下对应的html代码,你会发现这个单元格里还有一个元素,里面只有公司名。此外,还有一个链接元素,其中收录指向公司详细信息页面的链接。以后会用到!
为了区分公司名称和描述这两个字段,我们然后使用find方法读取元素中的内容,然后删除或替换公司变量中对应的内容,这样就只有描述了留在变量中。
要删除sales变量中多余的字符,我们可以使用一次strip方法。
我们最不想保存的是公司的 网站 链接。如上所述,在第二列中有一个指向公司详细信息页面的链接。每个公司的详细信息页面上都有一个表格。在大多数情况下,表格中有一个到公司的链接网站。
在公司详细信息页面上查看表格中的链接
为了抓取每个表中的 URL 并将其保存在变量中,我们需要执行以下步骤:
在原来的快速通道页面,找到您需要访问的公司详细信息页面的链接。
发起指向公司详细信息页面链接的请求
使用 Beautifulsoup 处理得到的 html 数据
找到您需要的链接元素
如上图所示,看了几个公司详情页,你会发现公司的网址基本都在表格的最后一行。所以我们可以找到表格最后一行的元素。
同理,最后一行可能没有链接。所以我们添加了一个 try...except 语句,如果找不到 URL,则将该变量设置为 None。在我们将所有需要的数据都存储在变量中之后(还在循环体中),我们可以将所有变量整合到一个列表中,然后将这个列表附加到我们上面初始化的行对象的末尾。
在上面代码的最后,我们在循环体完成后打印了行的内容,以便您在将数据写入文件之前再次检查。
写入外部文件
最后,我们将上面得到的数据写入外部文件,方便后续的分析处理。在 Python 中,我们只需要简单的几行代码就可以将列表对象保存为文件。
最后,让我们运行这个python代码。如果一切顺利,您会在目录中找到一个收录 100 行数据的 csv 文件。你可以用python轻松阅读和处理它。
总结
在这个简单的 Python 教程中,我们采取了以下步骤来抓取网页内容:
连接并获取网页内容
使用 BeautifulSoup 处理获取的 html 数据
循环搜索soup对象中需要的html元素
进行简单的数据清理
将数据写入csv文件
如果有什么不明白的,请在下方留言,我会尽力解答!
附件:本文所有代码()
祝您的爬虫之旅有一个好的开始!
编译源:
(完)
看完这篇文章你学会了吗?请转发并分享给更多人
专注“Python事物”,做全栈开发工程师
点击“观看”的人看起来会更好。