scrapy框架是python最出名的爬虫框架之一。之前用过,但是没有详细的记录过,现在需要进行整体系统的学习一遍。
一、python的异步爬虫框架
现在熟知的python 异步爬虫 有scrapy、tornado、aiohttp。 tornado 我个人是没有通过,aiohttp是异步框架(比较简单),第三方库完善程度也不是太好。所以现在用的最多的python爬虫还是scrapy。 可能很多人会疑问,python现在流行的异步是基于asyncio,也就是出现了aiohttp,那么scrapy为什么不用aiohttp呢?答案是scrapy出现的时候,还没有aiohttp什么鸟事。 我们都知道异步和同步的区别是:异步有回调,由开发者定义函数执行完的回调函数,同步则是由程序进行调控。所以说我们的异步都是基于事件循环。
- aiohttp基于asyncio,主要是创建一个pool,我们将协程对象放进去,进行回调执行。这个过程我感觉很像搞了一个node,同时py中很多语法也是基于node的。
- scrapy是基于twisted,twisted是py编写的事件驱动的网络框架。具体没有深究。。。
二、scrapy
scrapy很完善,完善的处理了很多大型爬虫搭建的基本功能。如果是小量爬虫,还是requests/aiohttp香。 scrapy能够完美的嵌入我们自己写的中间件,和搭配redis进行使用,这让它的功能更适合搭建大型爬虫。
这是网络上流传最多的图:
Scrapy --重拾(1)万年不变的图.png
简单的巩固一下自己的知识:
- 引擎(engine):负责整体(其他模块)的调度
- 调度器(scheduler): 负责引擎发送过来的requst,并排队入列,返回给引擎
- 下载器(downloader):负责引擎发送过来的requst,并将获取到的response返回给引擎
- 管道(pipline):负责引擎发送过来的数据,进行后期处理(持久化)
- 爬虫(spider):由开发者编写,主要功能是负责解析界面中的数据,将需要储存的和进一步请求的分别给引擎进行不同的处理
- 下载中间件(downloader_middlewares): 扩展自定义下载的功能,比如:ua、ip等
- spider中间件(spider_middlewares):自定义引擎和spider中间的功能。
基本的运转流程:
1、引擎从Spiders中获取到的最初的要爬取的请求(Requests)。
2、引擎安排请求(Requests)到调度器中,并向调度器请求下一个要爬取的请求(Requests)。
3、调度器返回下一个要爬取的请求(Request)给请求。
4、引擎从上步中得到的请求(Requests)通过下载器中间件(Downloader Middlewares)发送给下载器(Downloader),这个过程中下载器中间件(Downloader Middlerwares)中的process_request()函数就会被调用。
5、一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(Downloader Middlewares)中的process_response()函数,最后返回给引擎
6、引擎从下载器中得到上步中的Response并通过Spider中间件(Spider Middewares)发送给Spider处理,这个过程中Spider中间件(Spider Middlewares)中的process_spider_input()函数会被调用到。
7、Spider处理Response并通过Spider中间件(Spider Middlewares)返回爬取到的Item及(跟进的)新的Request给引擎,这个过程中Spider中间件(Spider Middlewares)的process_spider_output()函数会被调用到。
8、引擎将上步中Spider处理的及其爬取到的Item给Item管道(Piplline),将Spider处理的Requests发送给调度器,并向调度器请求可能存在的下一个要爬取的请求(Requests)
9、(从第二步)重复知道调度器中没有更多的请求(Requests)。
以上均是一字一码,复习不易,共同学习
网友评论