爬虫--分布式爬虫

分布式爬虫

--实现方式:scrapy+redis(scrapy结合scrapy-redis组件)

--原生的scrapy框架是无法实现分布式

  --分布式: 搭建一个分布式的机群,让机群中的每一台电脑执行同一组程序对同一组资源进行联合且分布的爬取

  --原生的scrapy框架

    --调度器无法被分布式机群共享

    --管道无法被分布式机群共享

--scrapy-redis组件的作用:

  --给原生的scrapy框架提供共享的管道和调度器

  --pip install scrapy-redis

--实现流程:

  --1.修改爬虫文件

    -1.1 导包:from scrapy_redis.spiders import RedisCrawlSpider

    -1.2 修改当前爬虫类的父类为:RedisCrawlSpider

    --1.3 将start_urls替换成redis_key属性,代表共享的调度器队列名称

      --redis_key = 'xxx' : 最终会将起始url放到这个队列中

    --1.4 将数据解析的操作补充完整

# 爬虫文件

复制代码
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_redis.spiders import RedisCrawlSpider
from scrapyredis.items import ScrapyredisItem

class FbsSpider(RedisCrawlSpider):
    name = 'fbs'
    # allowed_domains = ['www.xxx.com']
    redis_key = 'fbsQueue' # 可以被共享的调度器队列的名称
    # 稍后我们是要将一个其实urls手动的添加到调度器队列中
    rules = (
        Rule(LinkExtractor(allow=r'category/xxx/page/\d+'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        article_list = response.xpath('//article')
        for article in article_list:
            article_title = article.xpath('./div[2]/header/h2/a/@title').extract_first()
            item = ScrapyredisItem
            item['article_title'] = article_title
            yield item
复制代码

  --2.对settings.py进行配置

    --指定调度器     

# 增加了一个去重容器类的配置,作为使用Redis的set集合来存储请求的数据,从而实现请求去重
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
# 使用scrapy-redis组件自己的调度器
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
# 配置调度器是否需要持久化,即当爬虫结束了,是否要清空redis队列中的数据.
# 如果是True,则表示保留,通过这个可以实现增量式数据爬取
SCHEDULER_PERSIST = True

    --指定管道

ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline':400
}
# 该管道只能将item数据写入redis

    --指定redis

REDIS_HOST = 'redis服务的ip地址'
REDIS_PORT = 6379
REDIS_ENCODING = 'utf-8'
REDIS_PARAMS = {'password':'你的密码'}
# 如果有用户名和密码,同样进行配置

   --3.配置redis的配置文件(redis.window.conf)

    --解除默认绑定

      #bind 127.0.0.1  注释掉,否则只能127.0.0.1访问

    --关闭保护模式

      protected-mode yes  否则redis只读,不能写入数据,分布式爬虫需要将数据写入redis

  --4.启动redis服务和客户端:   redis-server    redis-cli

  --5.执行scrapy工程(不要在配置文件中加入LOG_LEVEL)

    --程序会监听listening,等到其实url加入

  --6.向redis_key表示的队列中添加其实url

    -- 需要在redis客户端执行如下指令:(调度器队列是在redis中的)

      --lpush fbsQueue https://www.xxx.com

  --7.数据是保存在redis中,再从redis中将数据保存到其他位置

 

posted @   EricYJChung  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示