scrapy架构流程

1.爬虫spiders将请求经过引擎传递给调度器schedulerpython

2.scheduler有个请求队列,在请求队列中拿出请求给下载器,downloadermysql

3.downloader从Internet的服务器端请求数据,下载下来redis

4.下载下来的响应体交还给咱们本身写的spiders,对响应体作相应的处理sql

5.响应体处理后有两种状况,1):若是是数据,交给pipeline管道,处理数据 2):若是是请求,接着交给调度器放到请求队列中等待处理,而后交给下载器处理,如此循环,直到没有请求产生mongodb

 

 

 

redis-scrapy是基于scrapy框架的一套组件数据库

scrapy是一个通用的爬虫框架,不支持分布式操做,scrapy-redis是为了更方便的是scrapy进行分布式的爬取,而提供了一些以redis为基础的组件(仅有组件)服务器

scrapy提供了四种组件(components),四种组件也就意味这四个模块都要作相应的修改:框架

  1. scheduler
  2. duplication filter
  3. item pipeline
  4. base spider

scrapy的去重是在内存中执行的,若是请求量很是大的时候,scrapy占用的内存会很是高,若是咱们把这个去重的指纹队列放到redis数据库中的话就会很方便了scrapy

scrapy中的数据是交给pipeline来处理的,在scrapy-redis中,数据是直接存储到redis数据库中的,而后咱们对数据进行处理持久化到mongodb中或者mysql中,由于redis也是基于内存的存储,不适合持久化数据分布式

Scheduler:

scrapy改造了python原本的collection.deque(双向队列)造成了本身的scrapy queue,可是scrapy多个spider不能共享待爬取队列scrapy queue,即scrapy自己不支持爬取分布式,scrapy-redis的解决是把这个scrapy queue换成redis数据库(也是指redis队列),从同一个redis-server存放要爬取的request,便能让多个spider从同一个数据库中读取。

scrapy中跟待爬队列直接相关的就是调度器scheduler,它把新的request进行入列操做,放到scrapy queue中,把要爬取的request取出,从scrapy queue中取出,它把待爬队列按照优先级创建了一种字典结构

{
优先级0:队列0
优先级1:队列1
优先级2:队列2
}

 

而后根据request中的优先级,来决定该入到哪一个队列中,出列时则是按照优先级较小的优先出列。对于这个较高级别的队列结构,scrapy要提供一系列的方法来管理它,原有的scrapy scheduler以没法知足,此时须要使用scrapy-redis中的scheduler组件。

duplication filter:

scrapy中用集合来实现request的去重功能。scrapy中将已经发送的request指纹信息放入到set中,而后把将要发送的request指纹信息和set中的进行比较,若是存在则返回,不然继续进行操做。核心实现功能代码以下:

 1 def request_seen(self,request):
 2     #self.request_figerprints就是一个指纹集合
 3     fp=self.request_fingerprint(request)
 4 
 5     #这就是判重的核心操做
 6     if fp in self.fingerprints:
 7         return True
 8     self.fingerprints.add(fp)
 9     if self.file:
10         self.file.write(fp+os.linesep)

 

 

相关文章
相关标签/搜索