分布式爬虫的创建与配置——实操演练

  scrapy_redis目前应用最多的一个分布式爬虫框架,与普通的scrapy相比,只需要在原有代码的基础上稍作修改,增加一些简单的配置文件即可实现分布式的数据抓取。本文以1905电影网为例,详细的介绍常见的分布式爬虫的创建与配置。

  首先通过scrapy框架,写好爬虫的基本功能部分。然后对爬虫继承的类进行简单的修改:

from scrapy_redis.spiders import RedisCrawlSpider  # 导入RedisCrawlSpider(如果你用的是Spider,则导入RedisSpider)


class DywSpider(RedisCrawlSpider):  # 将自定义的爬虫继承自RedisCrawlSpider
    name = 'dyw'
    redis_key = 'start'  # 设定redis_key,启动爬虫时需要用到
    allowed_domains = ['1905.com']
    # start_urls = ['https://www.1905.com/mdb/film/list/o0d0p1.html']  # 取消指定的起始url

    rules = (
        Rule(LinkExtractor(allow=r'o0d0pd+.html'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        """
        页面解析
        :param response:
        :return:
        """
        li_list = response.xpath('/html/body/div[2]/div[1]/ul/li')
        for li in li_list:
            title = li.xpath('./div/p[1]/a/text()').get()
            item = FbsDywItem(title=title)  # 实例化item
            yield item

  然后在settings.py中添加配置信息,常见设置可以直接复制粘贴。将配置好的爬虫项目,完整的复制到每一台机器上。

ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 400}  # scrapy_redis已经封装好的ITEM_PIPELINS,也可以根据需求添加自定义管道,将数据存储在mysql或其它地方
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'  # scrapy_redis的过滤器,对url进行去重
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'  # scrapy_redis的调度器
SCHEDULER_PERSIST = True  # True表示允许程序暂停,下次启动会沿用当前的request对象;False表示,每次启动程序都从头开始。建议为True

REDIS_HOST = '192.168.31.62'  # 指定主机的redis的ip
REDIS_PORT = '6379'  # 主机的redis的端口号,其他redis配置信息以同样的方式添加

  同时,需要修改redis的配置信息。找到redis的安装文件,打开redis.windows.conf,

第56行,bind127.0.0.1 关闭默认绑定,可以注释掉
第70行,protected-mode no 关闭保护模式,将yes改为no
设置好后,其他计算机才能对主机的redis服务端进行访问

  现在程序已经配置好,可以开始运行。

  首先携带配置信息启动redis的服务端,在终端中输入,redis-server redis.windows.conf,如果报错,可能是redis并没有被添加到环境变量中,此时可以切换到redis的安装目录下再启动(配置文件信息可能需要输入完整路径);若还是报错,检查redis服务是否已经开启,任务管理器-服务-redis,关闭即可。

  开启服务端后,再启动客户端,redis-cli。

  运行每一台机器的爬虫程序,在终端中切换到项目中spiders文件夹下,输入scrapy runspider 爬虫文件名(***.py),回车运行。若配置无误,则会出现:2020-03-24 17:54:05 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023,表示正在监听。此时,只需要将之前设定的redis_key和起始的url输入即可。切换到客户端,输入lpush redis_key(设定的key) 起始的url,回车运行,就可以看到爬虫程序已经开始跑起来了。

  注意,如果发现只有一台机器在爬取,其他的都在等待,可能是因为爬取的速度快于request对象生成的速度,导致其他机器没有获取到request,可以增加一个专门抓取url的方法。在python3.7中,运行时可能会报错,callback没找到,可尝试切换为3.6版本。

原文地址:https://www.cnblogs.com/xtjiaoyou/p/12560574.html