分布式部署爬虫

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一样写即可

你可能感兴趣的:(分布式部署爬虫)