python抓取网页数据(如何从FastTrack上获取2018年100强企业的信息)

优采云 发布时间: 2021-10-23 09:04

  python抓取网页数据(如何从FastTrack上获取2018年100强企业的信息)

  作为数据科学家的第一项任务是进行网络爬虫。那时,我对使用代码从网站获取数据的技术一无所知。这是最合乎逻辑和最简单的数据来源。经过几次尝试,网络爬虫对我来说几乎是本能的。今天,它已成为我几乎每天都在使用的少数技术之一。

  在今天的文章中,我会用几个简单的例子来给大家展示一下如何爬取一个网站——比如从Fast Track获取2018年100强企业的信息。使用脚本来自动化获取信息的过程,不仅可以节省人工整理的时间,还可以将所有企业数据组织在一个结构化的文件中,以便进一步分析和查询。

  版本太长看不懂:如果你只是想要一个最基本的Python爬虫程序的示例代码,本文用到的所有代码都在GitHub上

  准备好工作了

  每次你打算用 Python 做某事时,你问的第一个问题应该是:“我需要使用什么库?”

  有几个不同的库可用于网络爬虫,包括:

  今天我们计划使用 Beautiful Soup 库。您只需要使用 pip(Python 包管理工具)即可轻松将其安装到您的计算机上:

  安装完成后,我们就可以开始了!

  检查网页

  为了确定要抓取网页的哪些元素,首先需要检查网页的结构。

  以 Tech Track Top 100 Companies 页面(fasttrack.co.uk/league-tables/tech-track-100/league-table/)为例。右键单击表格并选择“检查”。在弹出的“开发者工具”中,我们可以看到页面上的每个元素以及其中收录的内容。

  右击要查看的网页元素,选择“勾选”,可以看到具体的HTML元素内容

  由于数据存储在表中,因此只需几行代码即可直接获取完整信息。如果您想自己练习抓取网页内容,这是一个很好的例子。但请记住,实际情况往往并非如此简单。

  在此示例中,所有 100 个结果都收录在同一页面上,并按标签分隔成行。但是,在实际的爬取过程中,很多数据往往分布在多个不同的页面上。您需要调整每个页面显示的结果总数或遍历所有页面以捕获完整数据。

  在表格页面上,您可以看到一个收录所有 100 条数据的表格。右键单击它并选择“检查”。您可以轻松查看 HTML 表格的结构。收录内容的表的主体在此标记中:

  

  每一行都在一个标签中,即我们不需要太复杂的代码,只需一个循环,就可以读取所有的表数据并保存到文件中。

  注意:您也可以通过检查当前页面是否发送了HTTP GET请求并获取该请求的返回值来获取页面显示的信息。因为 HTTP GET 请求往往可以返回结构化数据,例如 JSON 或 XML 格式的数据,以方便后续处理。您可以在开发者工具中点击Network类别(如果需要,您只能查看XHR标签的内容)。这时候可以刷新页面,这样页面上加载的所有请求和返回的内容都会在Network中列出。此外,您还可以使用某种 REST 客户端(例如 Insomnia)来发起请求并输出返回值。

  使用 Beautiful Soup 库处理网页的 HTML 内容

  熟悉了网页的结构,了解了需要爬取的内容后,我们终于拿起代码开始工作了~

  首先要做的是导入代码中需要用到的各个模块。我们上面已经提到过 BeautifulSoup,这个模块可以帮助我们处理 HTML 结构。下一个要导入的模块是urllib,负责连接目标地址,获取网页内容。最后,我们需要能够将数据写入CSV文件并保存在本地硬盘上,因此我们需要导入csv库。当然,这不是唯一的选择。如果要将数据保存为json文件,则需要相应地导入json库。

  下一步,我们需要准备好需要爬取的目标网址。如上所述,这个页面已经收录了我们需要的所有内容,所以我们只需要复制完整的 URL 并将其分配给变量:

  接下来我们可以使用urllib连接这个URL,将内容保存在page变量中,然后使用BeautifulSoup对页面进行处理,并将处理结果保存在soup变量中:

  

  这时候可以尝试打印soup变量,看看处理后的html数据是什么样子的:

  如果变量内容为空或返回一些错误信息,则表示可能无法正确获取网页数据。您可能需要在 urllib.error (/3/library/urllib.error.html) 模块中使用一些错误捕获代码来查找可能的问题。

  查找 HTML 元素

  由于所有的内容都在表(标签)中,我们可以在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 中,如果要处理大量数据,需要写入文件,列表对象非常有用。我们可以先声明一个空列表,填入初始头部(以备将来在CSV文件中使用),后续数据只需要调用列表对象的append方法即可。

  这将打印出我们刚刚添加到列表对象行中的第一行标题。

  您可能会注意到,我输入的标题中的列名称比网页上的表格多几个,例如网页和描述。请仔细查看上面打印的汤变量数据-否。在数据的第二行第二列,不仅有公司名称,还有公司网址和简要说明。所以我们需要这些额外的列来存储这些数据。

  接下来,我们遍历所有 100 行数据,提取内容,并将其保存到列表中。

  循环读取数据的方法:

  

  因为第一行数据是html表的表头,我们可以不看就跳过。因为header使用了标签,没有标签,所以我们简单地查询标签中的数据,丢弃空值。

  接下来,我们读出数据的内容并赋值给变量:

  如上代码所示,我们将8列的内容依次存入8个变量中。当然,有些数据的内容需要清理,去除多余的字符,导出需要的数据。

  数据清洗

  如果我们把company变量的内容打印出来,可以发现它不仅收录了公司名称,还收录了include和description。如果我们把sales变量的内容打印出来,可以发现里面还收录了一些备注等需要清除的字符。

  

  我们要将公司变量的内容拆分为两部分:公司名称和描述。这可以在几行代码中完成。看看对应的html代码,你会发现这个单元格里还有一个元素,里面只有公司名。此外,还有一个链接元素,其中收录指向公司详细信息页面的链接。我们以后会用到!

  

  为了区分公司名称和描述这两个字段,我们然后使用find方法读取元素中的内容,然后删除或替换公司变量中的对应内容,这样变量中就只剩下描述了.

  为了删除 sales 变量中多余的字符,我们使用了一次 strip 方法。

  我们要保存的最后一件事是公司的链接网站。如上所述,在第二列中有一个指向公司详细信息页面的链接。每个公司的详细信息页面上都有一个表格。在大多数情况下,表单中有指向公司 网站 的链接。

  检查公司详细信息页面上表格中的链接

  为了抓取每个表中的 URL 并将其保存在变量中,我们需要执行以下步骤:

  如上图所示,看了几个公司详情页,你会发现公司的网址基本都在表格的最后一行。所以我们可以在表格的最后一行找到元素。

  同样,也有可能最后一行没有链接。所以我们添加了一个 try...except 语句,如果找不到 URL,则将该变量设置为 None。在我们将所有需要的数据存储在变量中后(仍在循环体中),我们可以将所有变量集成到一个列表中,然后将这个列表附加到我们上面初始化的行对象的末尾。

  在上面代码的最后,我们在循环体完成后打印了行的内容,以便您在将数据写入文件之前再次检查。

  写入外部文件

  最后,我们将上面得到的数据写入外部文件,方便后续的分析处理。在 Python 中,我们只需要几行简单的代码即可将列表对象保存为文件。

  最后,让我们运行这个python代码。如果一切顺利,您会发现目录中出现一个收录 100 行数据的 csv 文件。您可以使用 python 轻松阅读和处理它。

  总结

  在这个简单的 Python 教程中,我们采取了以下步骤来抓取网页内容:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线