掌握Scrapy框架,轻松实现网页自动化爬取


掌握Scrapy框架,轻松实现网页自动化爬取

文章插图
爬虫框架:Scrapy
01
爬虫框架:Scrapy
按照官方的说法,Scrapy是一个“为了爬取网站数据,提取结构性数据而编写的Python/ target=_blank class=infotextkey>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所示 。
掌握Scrapy框架,轻松实现网页自动化爬取

文章插图
■ 图1-6Scrapy架构
可以通过pip十分轻松地安装Scrapy,安装Scrapy首先要使用以下命令安装lxml库:pip install lxml 。
如果已经安装lxml,那就可以直接安装Scrapy:pip install scrapy 。
在终端中执行命令(后面的网址可以是其他域名,如www.bAIdu.com):scrapy shell www.douban.com 。
可以看到Scrapy shell的反馈,如图1-7所示 。
掌握Scrapy框架,轻松实现网页自动化爬取

文章插图
■ 图1-7Scrapy shell的反馈
为了在终端中创建一个Scrapy项目,首先进入自己想要存放项目的目录下,也可以直接新建一个目录(文件夹),这里在终端中使用命令创建一个新目录并进入:
之后执行Scrapy框架的对应命令:
会发现目录下多出了一个新的名为newcrawler的目录 。其中items.py定义了爬虫的“实体”类,middlewares.py是中间件文件,pipelines.py是管道文件,spiders文件夹下是具体的爬虫,scrapy.cfg则是爬虫的配置文件 。然后执行新建爬虫的命令:
输出为:
不难发现,genspider命令就是创建一个名为DoubanSpider的新爬虫脚本,这个爬虫对应的域名为douban.com 。在输出中发现了一个名为basic的模板,这其实是Scrapy的爬虫模板 。进入DoubanSpider.py中查看(见图1-8) 。
掌握Scrapy框架,轻松实现网页自动化爬取

文章插图
■ 图1-8DoubanSpider.py
可见它继承了 scrapy.Spider 类,其中还有一些类属性和方法 。name用来标识爬虫 。它在项目中是唯一的,每一个爬虫有一个独特的name 。parse是一个处理 response 的方法,在Scrapy中,response 由每个 request 下载生成 。作为parse方法的参数,response是一个 TextResponse 的实例,其中保存了页面的内容 。start_urls列表是一个代替start_requests方法的捷径,所谓的start_requests方法,顾名思义,其任务就是从 url生成 scrapy.Request 对象,作为爬虫的初始请求 。之后会遇到的Scrapy爬虫基本都有着类似这样的结构 。
为了定制Scrapy爬虫,要根据自己的需求定义不同的Item,例如,创建一个针对页面中所有正文文字的爬虫,将Items.py中的内容改写为:
之后编写DoubanSpider.py:


推荐阅读