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