首先,什么是Scrapy框架?
Scrapy是一个快速、高层次、轻量级的屏幕抓取和web抓取的python爬虫框架
那什么是爬虫框架呢?
爬虫框架是实现爬虫功能的一个软件结构和功能组件集合;爬虫框架是一个半成品, 能够帮助用户实现专业网络爬虫。
Scrapy框架图如下:
先来看看Scrapy的5+2结构(五个主体+两个中间件):
-
Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
-
Scheduler(调度器): 负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
-
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,
-
Spiders(爬虫):负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),
-
Item Pipelines(管道):负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
-
Downloader Middlewares(下载中间件):实施Engine、Schedule和Downloader之间进行用户可配置的控制。用户可通过对中间件的编写修改、丢弃、新增请求或响应(对Requests、Response的修改)
-
Spider Middlewares(Spider中间件):对请求和爬取项的再处理。用户可以通过对Spider Middlewares的编写修改、丢弃、新增请求或爬取项
以上,可以总结为下表:
部件名称 | 作用 | 是否已实现 |
---|---|---|
Scrapy Engine | 总指挥:负责数据和信号的在不同模块间的传递 | Scrapy已经实现 |
Scheduler | 一个队列,存放引擎发过来的request请求 | Scrapy已经实现 |
Downloader | 下载被引擎发过来的requests请求,并返回给引擎 | Scrapy已经实现 |
Spiders | 处理引擎发来来的response,提取数据,提取url,并交给引擎 | 需自己编写 |
Item Pipelines | 处理引擎传过来的数据,比如存储 | 需自己编写 |
Downloader Middlewares | 可以自定义的下载扩展,比如设置代理 | Scrapy已经实现 |
Spider Middlewares | 可以自定义requests请求和进行response过滤 | Scrapy已经实现 |
再来看看三条主要的数据流路径:
-
路径一:① —➤ ②
Engine从Spiders获得爬取用户的请求(Requests)(请求可理解为一个URL),Scheduler模块负责对爬取请求进行调度
-
路径二:③ —➤ ④ —➤ ⑤ —➤ ⑥
Engine从Scheduler获得下一个要爬取的网络请求(一个真实的,要到网络上爬取的请求);
Engine将请求通过中间件发送给Downloader模块;后者获得请求后,真实连接互联网并爬取相关网页;
爬取到网页后,Downloader将内容形成一个Response对象,再将其通过中间件、Engine发送给Spiders -
路径三:⑦ —➤ ⑧
Spiders处理从Downloader获得的响应,处理后产生两个数据类型:爬取项(Scrapy ITEM)、新的爬取请求(Requests);
Spiders生成两个数据类型后,将它们发送给Engine模块,后者收到后,将ITEM发送给Item Pipelines,将Requests发送给Scheduler进行调度。注:在编写Spiders模块时,若网页中有其他链接是我们感兴趣的,可在Spiders中增加相关功能对新链接发起再次爬取。
综上,我们可以知道,Spiders向整个框架提供要访问的URL链接,解析从网络上获得的页面内容,是Scrapy框架的“入口”;Item Pipelines负责对提供的信息进行后处理,是Scrapy框架的“出口”。
说了这么多,那Scrapy框架有什么优点呢?
- 更容易构建大规模抓取项目;
- 采取了可读性更强的 xpath 代替正则
- 异步处理请求的速度快
- 可同时在不同的 url 上爬行
- 可编写 middleware,方便写一些统一的过滤器
- 使用自动调节机制自动调整爬取速度
- 可通过管道的方式存入数据库