python抓取动态网页(用脚本将获取信息上获取2018年100强企业的信息)

优采云 发布时间: 2022-01-22 09:06

  python抓取动态网页(用脚本将获取信息上获取2018年100强企业的信息)

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

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

  如果觉得篇幅太长不想看,可以关注转发。私聊小编“01”领取全部代码。

  准备好工作了

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

  对于网络抓取,有几个不同的库可用,包括:

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

  

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

  检查网页

  为了弄清楚要抓取网页的哪些元素,您需要首先检查网页的结构。

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

  

  

  右键单击要查看的网页元素并选择“检查”以查看特定的 HTML 元素内容

  由于数据存储在表中,因此只需要几行简单的代码即可直接获取完整信息。如果您想自己练习抓取 Web 内容,这是一个很好的示例。但请记住,现实往往不是那么简单。

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

  在表格页面,可以看到一张收录全部100条数据的表格,右键点击选择“inspect”,可以很容易的看到这个HTML表格的结构。收录内容的表体位于这样的标签中:

  

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

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

  

  刷新页面后,网络标签的内容更新了

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

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

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

  

  接下来我们需要准备要爬取的目标URL。如上所述,这个页面已经收录了我们需要的一切,所以我们只需要复制完整的 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销售额(今年的销售额)、员工(员工人数)和评论。

  这些都是我们需要的数据。

  这种结构在整个页面上是一致的(但在其他网站上可能就没有这么简单了!),所以我们可以再次使用find_all方法,通过搜索元素,逐行提取数据并将其存储在一个变量,方便以后写入csv或者json文件。

  循环遍历所有元素并存储在变量中

  在 Python 中,列表对象在处理大量数据和写入文件时很有用。我们可以先声明一个空列表,填入初始表头(方便以后在CSV文件中使用),然后数据只需要调用列表对象的append方法即可。

  

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

  你可能注意到我输入的表头比网页上的表多了几个列名,比如Webpage(网页)和Description(描述),请仔细看上面打印的soup变量数据——第一个第二行第二列的数据不仅收录公司名称,还收录公司网站和简要说明。所以我们需要这些额外的列来存储这些数据。

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

  循环读取数据的方法:

  

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

  接下来,我们读取数据的内容并将其分配给变量:

  

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

  数据清洗

  如果我们打印出公司变量的内容,我们可以看到它不仅收录公司名称,还收录描述和描述。如果我们打印出sales变量的内容,我们可以看到它还收录了一些需要清除的字符,例如备注符号。

  

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

  

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

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

  

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

  

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

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

  正如您在上面的屏幕截图中看到的,在查看了几个公司详细信息页面后,您会注意到公司的 URL 基本上在表格的最后一行。所以我们可以在表格的最后一行找到元素。

  

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

  

  在上面代码的最后,我们在循环体结束后打印行的内容,这样您可以在将数据写入文件之前进行检查。

  写入外部文件

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

  

  最后让我们运行这段python代码,如果一切顺利,你会在目录中找到一个收录100行数据的csv文件,你可以很容易地用python读取和处理它。

  总结

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

  如果有什么不明白的,请在下方留言,我会尽力为您解答!

  最后,如果有想要学习Python的朋友,可以关注、转发、后台私信小编“01”,免费获取Python学习资料。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线