回顾前面的爬虫流程
常规(蓝色窗口)
最开始的时候必须要有url地址,然后发送请求获取响应,提取数据,保存数据
偶尔(红色窗口)
我们需要从响应中提取url地址,然后重新对它发送请求获取响应
- requests模块:重新对这个url地址发送请求获取响应
- selenium模块:点击一下某个按钮
另一种形式的爬虫流程
1.我们现在不再把url地址放在列表中,而是放在队列中
2.发送请求获取响应
3.对响应进行处理
- 3.1提取数据,将数据放在数据队列中
- 3.2提取url地址,将url地址放在url队列中
4.数据队列,数据保存
scarpy的工作流程
那么scrapy是如何帮助我们抓取数据的呢?
scarpy的工作流程
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【爬虫】提取到的数据进行处理的
scrapy框架的组件
总结
通过流程图可以知道,在大多数情况下,我们需要写的只有两部分的内容,
- Spiders【爬虫】
- Item Pipeline【管道】
其他地方我们都不用做
所以说,我们使用框架不仅仅是为了加快我们的下载速度,我们的爬取速度,还能够帮助我们节省很多的代码量,因为很多的代码我们的框架都已经帮助我们实现好了(比如说发送请求),很多东西它的都帮助我们实现好了,因此我们没必要去管太多的东西,只需要关注重点就好了
重点:
- 我们应该怎么去写xpath把我们需要的数据拿到?
- 怎么去处理数据?
- 怎么样去做数据的保存?
除此之外,其他的内容,我们都不需要太过于关注。