欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

分布式部署爬虫

程序员文章站 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

上一篇: 某某杂记

下一篇: 分布式事务管理