分布式部署爬虫
程序员文章站
2022-07-12 16:54:59
...
redis是不支持Windows,只支持linux。有人开发了一套,可以直接使用
windows下的配置:
bind 127.0.0.1将这一行注释起来
protected_mode no 将yes修改为no即可
redis的可视化工具:redis desktop manager
分布式部署:
实现多台电脑共同爬取
scrapy支持分布式吗?不支持分布式
怎么办?
有人开发了一套基于scrapy的组件scrapy-redis,通过这套组件写的代码就可以实现分布式
https://github.com/rmax/scrapy-redis
scrapy-redis不是框架,是一套基于scrapy的组件
安装:
pip install scrapy-redis
添加起始url
lpush qingspider:start_urls 起始的url
执行:
scrapy runspider xxx.py
下面是关于spider 和crawlspider的官方重写方法
redisspider的方法:
from scrapy_redis.spiders import RedisSpider
'''
如果以前你的scrapy是通过Spider写的
现在你要实现分布式,参考这个模板即可
'''
class MySpider(RedisSpider):
"""Spider that reads urls from redis queue (myspider:start_urls)."""
name = 'myspider_redis'
# start_url
redis_key = 'myspider:start_urls'
# 构造方法,初衷非常好,想用这个方法动态定义允许域名列表,然后就不用allowed_domains
# 实际操作,是一个坑,这个方法不能使用,还得使用allowed_domains
def __init__(self, *args, **kwargs):
# Dynamically define the allowed domains list.
domain = kwargs.pop('domain', '')
self.allowed_domains = filter(None, domain.split(','))
super(MySpider, self).__init__(*args, **kwargs)
def parse(self, response):
return {
'name': response.css('title::text').extract_first(),
'url': response.url,
}
rediscrawlspider的方法:
from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor
from scrapy_redis.spiders import RedisCrawlSpider
'''
如果以前你的scrapy是通过CrawlSpider写的
现在你要实现分布式,参考这个模板即可
'''
class MyCraw'''
如果以前你的scrapy是通过Spider写的
现在你要实现分布式,参考这个模板即可
'''ler(RedisCrawlSpider):
"""Spider that reads urls from redis queue (myspider:start_urls)."""
name = 'mycrawler_redis'
redis_key = 'mycrawler:start_urls'
rules = (
# follow all links
Rule(LinkExtractor(), callback='parse_page', follow=True),
)
# 构造方法,初衷非常好,想用这个方法动态定义允许域名列表,然后就不用allowed_domains
# 实际操作,是一个坑,这个方法不能使用,还得使用allowed_domains
def __init__(self, *args, **kwargs):
# Dynamically define the allowed domains list.
domain = kwargs.pop('domain', '')
self.allowed_domains = filter(None, domain.split(','))
super(MyCrawler, self).__init__(*args, **kwargs)
def parse_page(self, response):
return {
'name': response.css('title::text').extract_first(),
'url': response.url,
}
settings.py的配置
SPIDER_MODULES = ['example.spiders']
NEWSPIDER_MODULE = 'example.spiders'
USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'
# 去重类
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 允许暂停
SCHEDULER_PERSIST = True
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,
# redis管道 开启管道,写入redis,默认是写到本机redis服务中
'scrapy_redis.pipelines.RedisPipeline': 400,
}
# 配置写入其它机器redis服务
REDIS_HOST = '10.0.1.1'
REDIS_PORT = 6379
LOG_LEVEL = 'DEBUG'
# Introduce an artifical delay to make use of parallelism. to speed up the
# crawl.
DOWNLOAD_DELAY = 1
如果你想继续用你的settings.py文档,那怎么定制你的分布式的settings的配置呢?
在你的爬中文件类中写:
custom_settings = {
# 去重类
'DUPEFILTER_CLASS': "scrapy_redis.dupefilter.RFPDupeFilter",
# 调度器
'SCHEDULER': "scrapy_redis.scheduler.Scheduler",
# 允许暂停
'SCHEDULER_PERSIST': True,
'ITEM_PIPELINES': {
'scrapy_redis.pipelines.RedisPipeline': 400,
},
# 配置写入其它机器redis服务
'REDIS_HOST': '10.0.120.89',
'REDIS_PORT': '6379',
'DOWNLOAD_DELAY': 1,
}
其他的和spider和crawlspider一样写即可
转载于:https://www.jianshu.com/p/821973afd06f