最开始的时候必须要有url地址,然后发送请求获取响应,提取数据,保存数据
我们需要从响应中提取url地址,然后重新对它发送请求获取响应
requests模块:重新对这个url地址发送请求获取响应selenium模块:点击一下某个按钮1.我们现在不再把url地址放在列表中,而是放在队列中 2.发送请求获取响应 3.对响应进行处理
3.1提取数据,将数据放在数据队列中3.2提取url地址,将url地址放在url队列中4.数据队列,数据保存
那么scrapy是如何帮助我们抓取数据的呢?
Scheduler【调度器】:队列,存放的并不是url地址,而是Request对象
Request对象:相当于我们定义的一个类,class Request,在这个Request中含有一些属性,url地址、headers、post数据、代理
这个Request对象会到Downloader【下载器】这个地方,然后Downloader【下载器】拿着Request对象发送请求获取响应Response
Downloader【下载器】:发送请求,获取响应,得到了一个Response 这个Response会到Spiders中
Spiders【爬虫】:提取数据,提取url地址
url地址先组装成Request对象,再交给我们的Scheduler【调度器】中
数据交给Item Pipeline【管道】进行数据的处理和保存
管道:把前一次的结果作为下一次的输入
ScrapyEngine【scrapy引擎】:位于中心,
我们的Request对象最开始的时候位于Scheduler【调度器】中,Request对象并不是直接到Downloader【下载器】的,而是我们的Scheduler【调度器】把Request对象交给了ScrapyEngine【引擎】,ScrapyEngine【引擎】负责把Request对象交给Downloader【下载器】;Downloader【下载器】负责把Response交给ScrapyEngine【引擎】,ScrapyEngine【引擎】负责把Response交给Spiders【爬虫】;Spiders【爬虫】爬取到的url地址组装成Request对象之后,也是交给ScrapyEngine【引擎】,ScrapyEngine【引擎】负责把Request对象交给Scheduler【调度器】;Spiders【爬虫】爬取到的数据也是先交给ScrapyEngine【引擎】,然后ScrapyEngine【引擎】负责把数据交给ItemPipeline【管道】Scheduler【调度器】、Downloader【下载器】、Spiders【爬虫】、ItemPipeline【管道】这四个模块之间相互联系,就算中间某一个模块发生了bug,发生了异常,也不会影响其他模块的正常执行,大大提高了程序的容错率
ScrapyEngine【引擎】负责调度所有的数据
DownloaderMiddlewares【下载中间件】:位于ScrapyEngine【引擎】和Downloader【下载器】中间
ScrapyEngine【引擎】会把Request对象交给Downloader【下载器】,由于DownloaderMiddlewares【下载中间件】位于ScrapyEngine【引擎】和Downloader【下载器】中间,所以我们的Request对象会经过DownloaderMiddlewares【下载中间件】再到Downloader【下载器】这个地方 说明,如果说我们自己写一个DownloaderMiddlewares【下载中间件】的话,是可以对这个Request对象做一些额外的处理的,比如说做一些修改和过滤……Response也是一样,Response从Downloader【下载器】经过DownloaderMiddlewares【下载中间件】到ScrapyEngine【引擎】 所以我们的DownloaderMiddlewares【下载中间件】也是可以对从Downloader【下载器】过来的Response做一些额外的处理的SpiderMiddlewares【爬虫中间件】:位于ScrapyEngine【引擎】和Spiders【爬虫】的中间
由于我们的ScrapyEngine【引擎】把Response交给Spiders【爬虫】的时候会经过SpiderMiddlewares【爬虫中间件】,所以SpiderMiddlewares【爬虫中间件】会对Response做一些额外的处理也是可以的
由于我们的url地址构造成Request对象会经过SpiderMiddlewares【爬虫中间件】然后交给ScrapyEngine【引擎】,所以经过SpiderMiddlewares【爬虫中间件】的Request对象也是可以在SpiderMiddlewares【爬虫中间件】中做一些过滤、修改……的操作
我们的Spiders【爬虫】会提取到数据,这个数据也是会经过SpiderMiddlewares【爬虫中间件】然后交给ScrapyEngine【引擎】,那么我们的SpiderMiddlewares【爬虫中间件】会对经过的数据进行处理吗? 不会 因为我们有专门的地方来对这个数据进行处理——Item Pipeline【管道】,所以我们的SpiderMiddlewares【爬虫中间件】是不会对Spiders【爬虫】提取到的数据进行处理的
通过流程图可以知道,在大多数情况下,我们需要写的只有两部分的内容,
Spiders【爬虫】Item Pipeline【管道】其他地方我们都不用做 所以说,我们使用框架不仅仅是为了加快我们的下载速度,我们的爬取速度,还能够帮助我们节省很多的代码量,因为很多的代码我们的框架都已经帮助我们实现好了(比如说发送请求),很多东西它的都帮助我们实现好了,因此我们没必要去管太多的东西,只需要关注重点就好了 重点:
我们应该怎么去写xpath把我们需要的数据拿到?怎么去处理数据?怎么样去做数据的保存?除此之外,其他的内容,我们都不需要太过于关注。