美文网首页
20180808_Scrapy源码第二天——源码第二更

20180808_Scrapy源码第二天——源码第二更

作者: 沉默百年的猴 | 来源:发表于2018-08-09 11:11 被阅读0次

    第二天开始写,嗯,,,心里还是有点发嘘,但今天争取把昨天没搞定的写完吧。程序再后台跑。

    嗯。先看两张今天收集到的比较牛皮的图片:

    传送门:(https://blog.csdn.net/weixin_37947156/article/details/74435304)

    先不说上面两张图片,先说一下昨天没弄懂的那个问题,为什么每个组件里面只要写class,哪儿调用了这个class?有没有实例化?

    先从程序入口开始main函数的execute方法:

    再看scrapy.cmdline里面的execute方法,可以发现,execute方法主要就是导入一些setting,然后读取你当前的command,规定了一下用法:

    其实想一想,excecute方法,也只能规定这些,剩余的肯定要在command里面进行了啊。所以现在来看command方法,要看具体命令,首先是init初始化,然后run一下crawl。再看cmdline里面,可以看到,里面利用crwalerprocess方法创建了一个crawler:

    继续看crawler,里面就好玩了啊。

    可以看到,这边初始化了两个东西,一个是spider,一个是engine。看到这儿,我们大体上可以理一遍。excute之后,先进cmdline。初始化之后,执行crawlerprocess创建一个crawler,通过crawler创建一个spider和一个engine。当然过程中传入了一些参数啊还有setting之类的东西。

    ok,那我们先看spider:

    整体结构可以看到,spider里面几个重要的东西,一个是name,一个是starturl:

    这些东西再spider初始化的时候就已经读取。还有两个方法,一个是start_request,一个是parse。通过之前写的程序我们就知道。start_request方法是对starturl进行重写。虽然我的程序里面没有进行重写,但是有什么好处呢?嗯,,,,我暂时是这样理解的。如果你用这种方法生成start_urls:

    那么你可能遇到的问题是!网页爬的贼乱,结果比较错综复杂。但是如果你重写start_request方法,会不会就是爬出来比较规整,先是法律,后是环保?。。。嗯,,,有待实验,先挖个坑(坑)。

    ok,上面讲了初始化的spider,包括几个比较重要的属性以及方法。下面再来说说初始化的engine。

    还是先上代码,engine包括的主要是两个class,一个是slot,一个是excution,我感觉,,,slot应该是进行初始化的一些操作,你看这个init方法,里面初始化了scheduler,初始化了start_request,剩下的重要的部分都在excution里面。

    再看excution

    这边新生成了对象有几个,downloader,scrapy,spider等,还启动了方法openspider,crawl,schedual以及nexturl。

    好了,敲黑板,划重点。看到没有看到没有?看前一篇文章的那个架构,总共组成部分有几个?downloaer,scraper,scheduler,全在engine里面了,有没有很帅?所以说,engine才叫engine,毕竟人家干了这么多活。

    ok,这样的话,就可以回到第一篇的那张图了。流程可以理清,engine通过start_request或者直接获取start_url,生成个request,然后给自己生出来的scheduler,同时scheduler给它一个下载的request,engine再把它给自己生出来的downloader,downloader处理后给个response回来给spyder,spyder处理之后看返回的是什么,如果是结果也就是Item,那就给ItemPipeline处理,如果是Request,就继续给engine。然后循环处理,知道scheduler里面没有新的请求或者url为止。

    上面的循环过程可以看第一篇的parse和parse_detail的返回,两个的callback不同。一个返回的是Item,另一个就是Url或者说request。

    ok,说到这儿,大体逻辑可以理清楚。再来说说本篇一开始给po出来的两张图。其实第一张说的是一个顺序问题,虽然图里面的顺序比较乱,但通过箭头可以看出来,跟之前的那张图其实本质上是差不多的。然后就是你大概知道的东西,比如,

    scheduler里面就可以规定调度顺序,调度速度?存储结构?之类的东西。那之后一些数据结构类型的东西就可以用在这儿,优化爬虫的话,可以在这边进行存储和调度url速度的优化。

    downloader里面可能是要处理的重点,包括并发怎么写,处理器怎么用,然后就是下载器中间件管理比较重要,包括dialing,proxy,cookie等等,都是应对网页反爬虫的机制。

    scrapyer里面就是一些爬虫的核心东西,比如爬的深度之类的,http怎么解析之类的,这个东西还不是太理解,因为除了css,xpath等还有其他解析结构?也许以后网页会边呢?讲不好。

    ok,今早花了好长时间写这个,真累死。

    还是那句话,有什么不对的地方,欢迎大家狠狠批斗我,不能误导他人,谢谢。

    相关文章

      网友评论

          本文标题:20180808_Scrapy源码第二天——源码第二更

          本文链接:https://www.haomeiwen.com/subject/bbhfbftx.html