scrapy进行分布式爬虫

一、分布式爬虫

  • 1.概念:
    我们需要搭建一个分布式的机群,让其对一组资源进行分布联合爬取。
  • 2.作用:
    提升爬取数据的效率
  • 3.依赖:
    pip install scrapy-redis
    • scrapy-redis作用:可以给原生的scrapy框架提供可以被共享的管道和调度器

二、实现流程

  • 1.创建一个工程:
    scrapy startproject ProjectName
  • 2.进入工程目录下:
    cd ProjectName
  • 3.创建一个基于CrawlSpider的爬虫文件:
    scrapy genspider -t crawl SpiderName www.xxxx.com
  • 4.将CrawlSpider修改为RedisCrawlSpider
  • 5.将start_urls和allowed_domains进行注释
  • 6.添加一个新属性(作为redis列表的key):
    redis_key = xxx
  • 7.执行工程:
    scrapy runspider xxx.py
  • 8.向调度器的队列中放入一个起始的url:
    • 调度器的队列在redis的客户端中:
      • lpush xxx www.xxx.com
  • 9.爬取到的数据存储在了redis的proName:items这个数据结构中

三、配置文件settings

  • 1.指定使用可以被共享的管道:
    ITEM_PIPELINES = {
    ‘scrapy_redis.pipelines.RedisPipeline’: 400
    }
  • 2.指定调度器:
    #增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
    DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter”

    #使用scrapy-redis组件自己的调度器
    SCHEDULER = “scrapy_redis.scheduler.Scheduler”

    #配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
    #这个设置可以实现增量式爬虫,每次只爬取更新过的数据。
    SCHEDULER_PERSIST = True
  • 3.指定redis服务器:
    REDIS_HOST = ‘redis服务的ip地址’
    REDIS_PORT = 6379
    REDIS_ENCODING =‘utf-8’
    REDIS_PARAMS = {‘password’:‘xx’}

四、配置redis.conf

1.修改

  • 注释该行:
    bind 127.0.0.1,表示可以让其他ip访问redis
  • 将yes改为no:
    protected-mode no,表示可以让其他ip操作redis

五、实例

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from fbsPro.items import FbsproItem
from scrapy_redis.spiders import RedisCrawlSpider


class FbsSpider(RedisCrawlSpider):
    name = 'fbs'
    # allowed_domains = ['www.xxx.com']
    # start_urls = ['http://www.xxx.com/']
    # 创建一个redis列表对应的key
    redis_key = 'sun'
    # 链接提取器
    link = LinkExtractor(allow=r'type=4&page=\d+')

    # 规则解析器
    rules = (
        Rule(link, callback='parse_item', follow=True),
    )

    def parse_item(self, response):
			...

            yield item

你可能感兴趣的:(#,python爬虫)