@(Spider)[POSTS]html
Scrapy
是一个应用于抓取、提取、处理、存储等网站数据的框架(相似Django
)。shell
应用:后端
还有不少,详细参考:http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/overview.html缓存
Scrapy
使用了Twisted
异步网络库来处理网络通信。结构以下:cookie
Scrapy
的核心组件:网络
引擎(Scrapy Engine
)
用来处理整个系统的数据流,触发事务(框架核心),负责控制和调度各个组件session
调度器(Scheduler
)
用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回,如:要抓取的连接(URL
)的优先队列,由它来决定下一个要抓取的URL
是什么,并进行去重。架构
下载器(Downloader
)
用于下载网页内容,并将网页内容返回给Spiders
(本身编写的虫子
)--下载器创建在Twisted
模型上框架
爬虫(Spider
)
干活的虫子
,从特定的网页中提取本身须要的信息,即:实体Item
,用户也能够提取下级连接,继续抓取页面内容。异步
项目管道(Pipline
)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体(Item
)、验证明体的有效性、清除垃圾信息。当页面被爬虫解析后,解析后内容将会发送到项目管理通道,通过几个特定的次序处理。
下载器中间件(Downloader Middlewares
)
位于Scrapy
引擎和下载器之间的框架,主要是处理Scrapy
引擎和下载器之间的请求与响应。
爬虫中间件(Spider Middlewares
)
介于Scrapy
引擎和Spider
之间的框架,处理爬虫的响应输入和请求输出。
调度中间件(Scheduler Middlewares)
介于Scrapy
引擎和调度之间的中间件,从Scrapy
引擎发送到调度的请求和响应。
从上面能够看出,
Scrapy
的耦合性很低,扩展性更灵活,自定义性好
以下图:
此图来自大神的文章
按照上图的序号,数据的执行流程以下:
引擎
从自定义爬虫
中获取初始化请求(种子URL--自定义爬虫
文件中的start_urls
)调度器
中,同时引擎从调度器获取一个待下载的请求
(两者异步执行)待下载请求
待下载请求
发送给下载器
,中间会通过一系列下载器中间件
待下载请求
通过下载器处理以后,会生成一个响应对象(response)
,返回给引擎,中间会再次通过一系列下载器中间件
响应对象(response)
后,将其发送给自定义爬虫
,执行自定义逻辑
,中间会通过一系列爬虫中间件
响应对象(response)
通过内部的选择器
筛选并调用回调函数
处理后,完成逻辑,生成结果对象
或新的请求对象
给引擎,再次通过一系列爬虫中间件
结果对象
交给结果处理器
处理,将新的请求对象
交给调度器
新的请求对象
重复上述过程,直到没有新的请求处理
新的请求对象:
多层URL的筛选中的下一层URL
==> 详细组件关系,待解读完源码后继续跟上。
上面介绍的仅仅是冰上一角,Scrapy提供了不少强大的特性是爬虫更加高效,例如: