Python爬虫案例与实战:Scrapy框架与Selenium
1.4.1爬虫框架:Scrapy
按照官方的说法,Scrapy是一个“为了爬取网站数据,提取结构性数据而编写的Python应用框架,可以应用在包括数据挖掘、信息处理或存储历史数据等各种程序中”。Scrapy最初是为了网页抓取而设计的,也可以应用在获取API所返回的数据或者通用的网络爬虫开发之中。作为一个爬虫框架,可以根据自己的需求十分方便地使用 Scrapy编写出自己的爬虫程序。毕竟要从使用 Requests(请求)访问URL开始编写,把网页解析、元素定位等功能一行行写进去,再编写爬虫的循环抓取策略和数据处理机制等其他功能,这些流程做下来,工作量其实也是不小的。使用特定的框架有助于更高效地定制爬虫程序。作为可能是最流行的Python爬虫框架,掌握 Scrapy爬虫编写是在爬虫开发中迈出的重要一步。从构件上看,Scrapy这个爬虫框架主要由以下组件组成。
引擎(Scrapy):用来处理整个系统的数据流处理,触发事务,是框架的核心。
调度器(Scheduler):用来接收引擎发过来的请求,将请求放入队列中,并在引擎再次请求的时候返回。它决定下一个要抓取的网址,同时担负着网址去重这一项重要工作。
下载器(Downloader):用于下载网页内容,并将网页内容返回给爬虫。下载器的基础是twisted,一个Python网络引擎框架。
爬虫(Spiders):用于从特定的网页中提取自己需要的信息,即 Scrapy 中所谓的实体(Item)。也可以从中提取出链接,让 Scrapy继续抓取下一个页面。
管道(Pipeline):负责处理爬虫从网页中抽取的实体,主要的功能是持久化信息验证实体的有效性、清洗信息等。
下载器中间件(Downloader Middlewares):Scrapy 引擎和下载器之间的框架,主要处理 Scrapy引擎与下载器之间的请求及响应。
爬虫中间件(Spider Middlewares):Scrapy 引擎和爬虫之间的框架,主要工作是处理爬虫的响应输入和请求输出。
调度中间件(Scheduler Middewares):Scrapy 引擎和调度之间的中间件,从Scrapy 引擎发送到调度的请求和响应。
它们之间的关系示意如图1-6所示。
可以通过pip十分轻松地安装Scrapy,安装 Scrapy首先要使用以下命令安装lxml库:pip install lxml。
如果已经安装1xml,那就可以直接安装Scrapy:pip install scrapy。在终端中执行命令(后面的网址可以是其他域名,如 www.baidu.com):scrapy shell www.douban.com。
可以看到 Scrapy shell的反馈,如图1-7所示。
为了在终端中创建一个Scrapy项目,首先进入自己想要存放项目的目录下,也可以直接新建一个目录(文件夹),这里在终端中使用命令创建一个新目录并进入:
mkdir newcrawler
cd newcrawler/
之后执行 Scrapy框架的对应命令:
scrapy startproject newcrawler
会发现目录下多出了一个新的名为newcrawler的目录。其中items.py定义了爬虫的
“实体”类,middlewares.py是中间件文件,pipelines.py是管道文件,spiders文件夹下是具体的爬虫,scrapy.cfg则是爬虫的配置文件。然后执行新建爬虫的命令:scrapy genspider DoubanSpider douban.com
输出为:
Created spider'DoubanSpider'using template'basic'
不难发现,genspider命令就是创建一个名为 DoubanSpider的新爬虫脚本,这个爬虫对应的域名为douban.com。在输出中发现了一个名为basic的模板,这其实是Scrapy的爬虫模板。进人 DoubanSpider.py 中查看(见图1-8)。
可见它继承了scrapy.Spider类,其中还有一些类属性和方法。name用来标识爬虫。它在项目中是唯一的,每一个爬虫有一个独特的name。parse是一个处理response的方法,在 Scrapy 中,response由每个request下载生成。作为parse方法的参数,response是一个TextResponse的实例,其中保存了页面的内容。start_urls列表是一个代替 start_requests()方法的捷径,所谓的 start_requests方法,顾名思义,其任务就是从url生成scrapy.Request对象,作为爬虫的初始请求。之后会遇到的 Scrapy爬虫基本