大家用过谷歌,百度吧。这类搜索引擎是怎么对外提供服务的呢?显然,这不是本文要说的事情。但是,任何一个搜索引擎,都缺不了网页收录这个步骤,所以网络爬虫是搜素引擎最重要,也是最基本的组成部分。那么我们每个人其实都可以写一个简单的网络爬虫,用来爬你自己喜欢的东西,你懂的。那么,我们就废话少说,开始吧。
网络爬虫(网络蜘蛛)经常被人们认为是一项特别强大而实用的工具,用来从网上搜集各种不同的数据。其实它的本质就是通过编程的手段来访问一系列不同的网页并抽取页面中的数据信息。
利用网络爬虫,我们可以搜集文本,图片以及其他类型的数据。而这些事情,并不需要通过你要访问的网站提供官方的API,你只需要模拟浏览器的行为来达到这个简单的目的。
在这里,你会了解到网络爬取信息的基本概念和组成部分。我们也会用Quotes to Scrape(http://quotes.toscrape.com/)作为例子来了解如何抽取这个网站上面我们所关心的数据。跟着一路走下来,你会完成一个简单的网络爬虫,它的功能就是爬取Quotes to Scrape(http://quotes.toscrape.com/)的页面,并且抽取我们所关心的数据。
热身,热身
既然安装完了Python,下面就来看看,如何创建一个简单的爬虫。创建爬虫有好多方式,条条大路通罗马。但是,我们想走效率高的,不绕弯的,不掉坑里的一条路。开源社区有很多不错的选择,在这里,我选用的是Scrapy框架。Scrapy帮助我们解决了绝大部分的繁琐事情,让我们真正专注于要关心的逻辑,也就是你要爬取哪些页面,抽取哪些数据,并如何存储它们。
如何安装Scrapy?非常简单,打开Shell或者命令行窗口,运行下面的命令
$pip install scrapy
如上图所示,Scrapy安装成功了。我们可以运行一个简单的命令,来检验一下Scrapy是否可以正常工作。运行如下命令,是否返回HTML的内容。
如果能够返回HTML页面的信息,则说明scrapy工作正常。接下来,我们可以创建一个文件夹,用来保存我们的爬虫类。运行下面的命令,创建一个文件夹
$mkdir scrapy-spiders
进入你刚创建的文件夹
$cd scrapy-spiders
创建一个新的Python文件(用你自己喜欢的文本编辑器,我这里用的是VIM),文件名称叫quotespider.py。
$vim quotespider.py
我们通过创建一个scrapy.Spider的派生类,来达到简化繁琐工作的目的。大部分的工作已经被包含在scrapy.Spider这个类当中了,这个类是scrapy框架提供的。我们需要修改其中的属性,就可以达到自定义的目的。这里,我们为了简化和演示的目的,仅仅修改两个属性,name和start_urls。
name--- 给你的网络爬虫起一个名字
start_urls--- 网络爬虫从哪个网址开始爬取,可以是一个网址,也可以是一批网址
修改之后的quotespider.py文件内容如下:
让我们简单地逐行说明一下程序代码的意思。首先,我们在程序第一行中引入scrapy框架。然后,我们在第二行创建了一个名字叫做QuoteSpider的类。这个类是scrapy.Spider的子类。接着,我们在第三行,第四行修改了name和start_urls的属性。好啦,我们第一步的任务结束啦。现在可以运行一下,看看结果是什么。
大家看到红线的部分,返回值是200,证明我们成功地爬取了网址。但是,下面有错误,原因是蓝线的部分造成的。下面将在第二部分修正这个部分。实现一个parse的方法,来告诉爬虫,当成功爬取了网址之后,我们需要如何解析这个网页的内容。也就是如何抽取页面当中我们关心的数据。
在实现如何解析页面之前,让我们看一下页面的结构,从而发现在哪里可以找到我们关心的数据。借助Chrome的开发者工具,我们可以定位到我们需要抽取的信息节点的位置。假设我要抽取每段的名句,并不关心作者是谁。
用开发者工具,我找到了这个信息在HTML文档DOM树中的结点位置。
那么我就可以用scrapy框架自带的CSS或者XPath选择器,来选中我关心的结点,然后读取里面的文本值。修改之后的quotespider.py文件内容为
运行一下程序,结果如下
假如,进一步我们需要把作者信息也抽取出来,那么我们只需要再多加一行代码,来读取作者的信息。
运行结果就会包含作者信息了。
到目前为止,你已经会爬取一个单独的页面,并且可以抽取你想要的信息了。如果我们想抽取的信息是保存在页面中某个超链接里面呢?那就需要进一步访问那个超链接去获得进一步的信息。下一步介绍如果继续访问页面中的超链接,你其实也应该想得到,跟访问一个页面是同样的。只需要获得那个超链接的网址,爬取那个页面,并按照刚才的步骤去解析网页就好了。
我们观察到每一句名言下面都有作者,作者的后面跟着一个超链接,用来介绍作者的详细信息。那么就可以通过CSS选择器选中超链接,并且访问那个超链接。对于超链接返回的页面,可以自定义一个专门用来解析作者详细信息的方法,叫做parse_author。那么,就很容易抽取我们想要的作者详细信息了。
下面是修改之后的quotespider.py文件内容
在代码中,可以看到通过".author+a::attr(href)"选中了超链接的相对地址,然后调用response.follow方法,并设置parse_author作为解析页面的方法。parse_author的方法内部,对三个页面标签做了抽取,他们是名字,出生日期和出生地点。运行一下程序,结果如下
从程序输出结果来看,我们成功的抽取了超链接的内容。根据这个思路,可以设计一个比较复杂的爬虫,来爬取这个网站的所有页面,并把相关的数据保存下来。
关于如何保存成不同类型的文件,而不是输出到shell或者控制台中,可以实用命令行参数-o,比如下面就是一个输出成JSON的例子。Scrapy还支持多种文件格式,比如csv,JSON Lines,XML。
$scrapy runspider quotespider.py -o crawlresult.json
到这里,就介绍完了如何创建一个简单的爬虫。
参考链接:
Scrapy Library: https://doc.scrapy.org/en/latest/intro/overview.html