天天看点

如何用 Python 实现 Web 抓取?

如何用 Python 实现 Web 抓取?

随着电子商务的蓬勃发展,笔者近年越来越着迷于比价应用。我在网络上(甚至线下)的每次购买,都是在各大电商网站深入调研后的结果。

笔者常用的比价应用包括:redlaser, shopsavvy 以及 buyhatke。这些应用有效提高了价格透明度,进而为消费者节省了可观的时间。

但是,你是否想过,这些应用如何得到那些重要数据?通常,它们会借助 web 抓取技术来完成该任务。

web 抓取是抽取网络数据的过程。只要借助合适的工具,任何你能看到的数据都可以进行抽取。在本文中,我们将重点介绍自动化抽取过程的程序,帮助你在较短时间内收集大量数据。除了笔者前文提到的用例,抓取技术的用途还包括:seo 追踪、工作追踪、新闻分析以及笔者的最爱——社交媒体的情感分析!

当你打开网络中的某个站点时,就会下载其 html 代码,由你的 web 浏览器对其进行分析与展示。该 html 代码包含了你所看到的所有信息。因此,通过分析 html 代码就能得到所需信息(比如价格)。你可以使用正则表达式在数据海洋中搜索你需要的信息,也可以使用函数库来解释 html,同样也能得到需要数据。

安装完成之后,我们大致会遵循以下步骤实现 web 抓取:

向 url 发送请求

接收响应

分析响应以寻找所需数据

作为演示,我们将使用笔者的博客 <code>http://dada.theblogbowl.in/</code>. 作为目标 url。

前两个步骤相对简单,可以这样完成:

接下来,将响应传给之前安装的模块:

在将 html 传给 beautifulsoup 之后,我们可以尝试一些指令。譬如,检查 html 标记代码是否正确,可以验证该页面的标题(在 python 解释器中):

接下来,开始抽取页面中的特定元素。譬如,我想抽取博客中文章标题的列表。为此,我需要分析 html 的结构,这一点可以借助 chrome 检查器完成。其他浏览器也提供了类似的工具。

如何用 Python 实现 Web 抓取?

使用 chrome 检查器检查某个页面的 html 结构

如你所见,所有文章标题都带有 <code>h3</code> 标签与两个类属性:<code>post-title</code> 与 <code>entry-title</code> 类。因此,用 <code>post-title</code> 类搜索所有 <code>h3</code> 元素就能得到该页的文章标题列表。在此例中,我们使用 beautifulsoup 提供的 <code>find_all</code> 函数,并通过 <code>class_</code> 参数确定所需的类:

只通过 <code>post-title</code> 类进行条目搜索应该可以得到相同的结果:

如果你想进一步了解条目所指的链接,可以运行下面的代码:

beautifulsoup 内置了许多方法,可以帮助你玩转 html。其中一些方法列举如下:

目前为止,我们做的只是下载一个页面进而分析其内容。然而,web 开发者可能屏蔽了非浏览器发出的请求,或者有些网站内容只能在登录之后读取。那么,我们该如何处理这些情况呢?

对于第一种情况,我们需要在向页面发送请求时模拟一个浏览器。每个 http 请求都包含一些相关的数据头(header),其中包含了访客浏览器、操作系统以及屏幕大小之类的信息。我们可以改变这些数据头,伪装为浏览器发送请求。

至于第二种情况,为了访问带有访客限制的内容,我们需要登录该网站,使用 cookie 保持会话。下面,让我们来看看在伪装成浏览器的同时,如何完成这一点。

我们将借助 <code>cookielib</code> 模块使用 cookie 管理会话。此外,我们还将用到 <code>mechanize</code>,后者可以使用 pip 之类的安装程序进行安装。

如何用 Python 实现 Web 抓取?

通知页面的结构

如何用 Python 实现 Web 抓取?

登录进通知页面后的结果

许多开发者会告诉你:你在网络上看到的任何信息都可以被抓取。通过这篇文章,你学会了如何轻松抽取登录后才能看到的内容。此外,如果你的 ip 遭到了屏蔽,你可以掩盖自己的 ip 地址(或选用其他地址)。同时,为了看起来像是人类在访问,你应该在请求之间保留一定的时间间隔。

随着人们对数据的需求不断增长,web 抓取(不论原因好坏)技术在未来的应用只会更加广泛。也因此,理解其原理是相当重要的,不管你是为了有效利用该技术,还是为了免受其坑害。