网络爬虫scrapyScrapy Python 爬虫 框架我爱编程

关于Redis在分布式爬虫中的应用

2017-04-06  本文已影响664人  c4a1d989518e

首先redis安装过程中,第一个坑就是安装的是server还是client,这里需要注意下。

redis在爬虫项目中有什么用处?举个例子,在redis中存取的是要爬取的图片的地址。如果是分布式的爬虫,有多台计算机在爬取,如何避免爬取出现重复呢?这时候redis的优势就出来了,它可以标记出哪些是一台计算机爬取过的,还有哪些是没有爬取过的。这样就不至于出现冲突了。

pip install scrapy_redis

这一步并不是安装了redis,而是安装了一个“连接器”,连接scrapy和redis,使得scrapy能够使用redis。

另打开一个命令行,输入,来启动redis

redis-server

在scrapy中,用来爬取的py文件。

from scrapy_redis.spiders import RedisSpider

class HelloSpider(RedisSpider):

     name ="hellospider"

     redis_key ='hellospider:start_urls'

这里的redis_key里的内容可以随意写,可以改成‘x:x'

还有就是在settings.py文件中修改了

首先是Scheduler的替换,这个东西是Scrapy中的调度员。

# Enables scheduling storing requests queue in redis.

SCHEDULER="scrapy_redis.scheduler.Scheduler"

去重

# Ensure all spiders share same duplicates filter through redis.

DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"

不清理redis队列

(如果这一项为True,那么在Redis中的URL不会被Scrapy_redis清理掉,这样的好处是:爬虫停止了再重新启动,它会从上次暂停的地方开始继续爬取。但是它的弊端也很明显,如果有多个爬虫都要从这里读取URL,需要另外写一段代码来防止重复爬取。

如果设置成了False,那么Scrapy_redis每一次读取了URL以后,就会把这个URL给删除。这样的好处是:多个服务器的爬虫不会拿到同一个URL,也就不会重复爬取。但弊端是:爬虫暂停以后再重新启动,它会重新开始爬。)

# Don't cleanup redis queues, allows to pause/resume crawls.

SCHEDULER_PERSIST=True

Redis信息,如果不配置的话,Scrapy_redis会默认Redis就运行在现在这台电脑上,IP和端口也都是默认的127.0.0.1和6379。如果Redis不在本地的话,就需要将它们写出来:

REDIS_HOST='127.0.0.1'#修改为Redis的实际IP地址

REDIS_PORT=6379#修改为Redis的实际端口

这时候将scrapy运行起来,运行起来以后,爬虫就一直处于运行状态,并监听redis中的数据,我们刚开始没有数据,可以在redis中喂数据,然后爬虫就跟狗似得,去吃数据。

这就是启动redis-cli,并喂数据的格式,其中的x:x,就是上面我们提到的redis_key。

在真实的爬虫中,会利用回调函数,向redis中不断的放数据,然后又有专门的函数来爬取,放的网址。

上图是一个简易的分布式爬虫的架构,可以把scrapy的代码分别拷给各个slave设备,然后在Ubuntu的master设备上装redis,它仅仅是作为一个待爬网址的临时中转,所以甚至不需要安装Python

当放一个起始URL到Redis以后,其中一个Slave爬虫就能开始运行了。它拿到这个URL以后,就会在Redis中将这个URL置为已经访问的状态,所以其他Slave不会重复抓取。而第一个拿到URL的爬虫将更多的URL放进Redis以后,其他爬虫就可以拿到这些URL并开始抓取,然后再放更多的URL进去。这就像是原子弹的链式反应,爬取速度越来越快,最后达到所有爬虫都全速运行的状态。

上一篇 下一篇

猜你喜欢

热点阅读