一、爬虫框架Scrapy总览
上图就是整个Scrapy的架构图了,主要包括部分作用如下:
- Scrapy Engine:爬虫引擎,负责制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。简单来说,就是负责Spiders、ItemPipeline、Downloaders和Scheduler之间的信息传递。
- Scheduler:调度器,负责接受引擎发送过来的requests请求,并按照一定的方式排列这些请求,等待Scrapy Engine来请求时交给它。
- Downloader:下载器,负责下载Scrapy Engine发送的所有Requests请求,并将获取的Responses交给Scrapy Engine,由其交给Spiders来处理。
- Spiders:负责处理所有的Responses,从中分析提取数据,获取Item需要的数据,并将需要跟进的URL提交给Scrapy Engine,由其交给Scheduler。
- Item Pipeline:项目管道,负责处理Spiders中得到的Item,像去重、持久化等操作。
- Downloader Middlewares:中间下载器,可以让你自定义扩展下载功能的组件。
- Spider Middlewares:用于扩展Scrapy Engine和Spiders之间交互的组件。
Scrapy执行流程:
- Scrapy Engine从Spiders获取初始的URL,并将这些request交给Scheduler进行排列。
- Scrapy Engine从Scheduler获取处理好的request。
- Scrapy Engine将request传递给Downloader,让其下载。
- Downloader将下载好的Responses返回给Scrapy Engine。
- Scrapy Engine将Responses交给Spiders进行处理,默认传递给Spiders的parse()函数,所以Spiders必须定义这个函数。
- Spiders提取出Item需要的数据和接着要爬的URL,并将这些数据和URL交给Scrapy Engine。
- Scrapy Engine将数据交给Item Pipeline进行处理,将URL交给Scheduler
- 重复步骤2,直到Scheduler中不存在任何requests,程序停止。
二、一个简单的使用Scrapy的例子:
目标:爬取Python官网(https://www.python.org/),获得网页的title、url和body,暂时不存储数据。
1.创建一个Scrapy项目,使用如下命令(项目名为python_project,可以自己更改):
scrapy startproject python_project
创建项目后,在命令运行的目录下会产生一个与项目同名的文件夹,其结构大致如下:
这些文件的作用大致如下:
- scrapy.cfg:项目的配置文件
- items.py:用于定义临时存储的数据,所有需要获取的数据都必须在这个文件中有定义。
- middlewares.py:用于定义中间器,像Spider Middlewares和Downloader Middlewares
- pipelines.py:用于处理获取的数据,像去重、持久化等。
- settings.py:项目的配置文件
- spiders文件夹:用于存放Spiders代码的目录
2.定义Item:item是保存爬取到的数据的容器,其使用方法与python字典类似,并且踢动额外的保护机制来避免拼写错误导致的未定义字段错误。
通过创建一个scrapy.Item类,并定义类型为scrapy.Field的类属性来定义一个Item。
这里,我们需要从网站获取title、url和body,因此在item中定义相应的字段。编辑items.py文件如下:
import scrapy class PythonProjectItem(scrapy.Item): title = scrapy.Field() url = scrapy.Field() body = scrapy.Field()
3.编写Spider:Spider是用户编写用于从网站爬取数据的类,包含了:一个用于下载的初始URL,如何跟进网页中的链接(如域名限制等)以及如何分析网页中的内容,提取生成item的方法。
为了创建一个Spider,必须继承scrapy.Spider类,并定义以下三个属性或方法:
- name:用于区别不同的Spider,因此每个Spider的名字必须是唯一的。这样,就可以通过name来直接启动爬虫
- start_url:定义Spider启动时进行爬取的URL列表,后续的URL则从初始的URL获取的数据中提取。
- parse( ):每个URL完成下载后生成的Response对象会作为唯一参数传递给该函数。这个方法负责解析返回的数据(response data),提取数据生成item以及生成要进一步处理的URL的Resuest对象。
这里我们在parse函数中不定义获取URL的实现,只解析要获取的数据。因此这个爬虫只有一个URL可用,爬虫爬取完这个网页便会停止。在spiders目录下新建python_spider.py文件,编辑如下: