将scrapy项目变成一个scrapy-redis项目

发布于 2019-09-11  7 次阅读


scrapy-redis 官网和github地址

官网地址:https://scrapy-redis.readthedocs.org
github地址:https://github.com/rmax/scrapy-redis

一、scrapy-redis说明

由于 scrapy 是不支持分布式的,为了加快爬虫速度,需要多台机器同时爬取目标url并且同时从url中抽取数据,让N台机器做一模一样的事,通过一个中间件来调度、中转。scrapy-redis 分布式爬虫框架是在多台服务器(A B C服务器)进行数据爬取,他们不会重复交叉爬取(需要用到状态管理器)。

分布式爬虫优点:

① 充分利用多台机器的带宽速度爬取数据
② 充分利用多台机器的IP爬取

二、将scrapy项目变成一个scrapy-redis项目

1、将爬虫的类从 scrapy.Spider 变成 scrapy_redis.spiders.RedisSpider,或者是从 scrapy.spiders.CrawlSpider 变成 scrapy_redis.spiders.RedisCrawlSpider

2、将爬虫的 start_urls 删除,增加一个 redis_key=“xxxx” 。这个 redis_key 是为了以后在 redis 中控制爬虫启动的。爬虫的第一个 url 就是在 redis 中通过这个发送出去的。

from scrapy_redis.spiders import RedisSpider
class MySpider(RedisSpider):
    name = 'myspider'
    redis_key="myspider:start_url"   #这个名字随便写

    def parse(self, response):
        # do stuff
        pass

或者
from scrapy_redis.spiders import RedisCrawlSpider
class MySpider(RedisCrawlSpider):
    name = 'myspider'
    allowed_domains = ['example.com']
    redis_key="myspider:start_url"

    rules = (
        Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        # do stuff
        pass

3、在配置文件中增加如下配置

#确保request存储到redis中
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

#确保所有爬虫共享相同的去重指纹
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

#在redis中保持scrapy-redis用到的队列,不会清除redis中的队列,从而实现暂停和恢复的功能
SCHEDULER_PERSIST = True

#设置redis为 item pipline
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 300
}

#redis配置(下面有两种方式)
#方式一:没有密码
#REDIS_HOST = 'localhost'
#REDIS_PORT = 6379

#方式二:有密码
REDIS_URL = 'redis://user:pass@hostname:6379'

#爬虫起始url,也可以在redis中添加此参数
#REDIS_START_URLS_KEY = '%(name)s:start_urls'

#redis字符集设定
REDIS_ENCODING = 'utf8'

三、运行项目

1、在爬虫服务器上,进入到爬虫文件所在的路径(也就是spiders目录),然后输入命令:scrapy runspider [爬虫名字]
2、在Redis服务器上,推入一个起始的url连接,redis-cli> lpush {redis_key} start_url 开始爬取
例如:

redis-cli> lpush myspider:start_url http://google.com

人間になるために生まれて、私はとても悲しいです