scrapy框架之分布式操作

一.redis

  1.启动redis:

    mac/linux:   redis-server redis.conf

    windows: redis-server.exe redis-windows.conf

  2.对redis配置文件进行配置:

    - 注释该行:bind 127.0.0.1,表示可以让其他ip访问redis

    - 将yes该为no:protected-mode no,表示可以让其他ip操作redis

二.scrapy基于redis的数据持久化操作流程

  1.安装scrapy-redis组件:

    - pip install scrapy-redis

    - scrapy-redis基于scrapy框架开发出的一套组件,其作用就是可以让scrapy实现分布式爬虫

  2.编写爬虫文件:

    - 同之前scrapy中基于Spider或者CrawlSpider的编写方式一致。

  3.编写管道文件:

    - 在scrapy-redis组件中已经帮助我们封装好了一个专门用于连接存储redis数据库的管道(RedisPipeline),因此我们直接使用即可,无需自己编写管道文件。

  4.编写配置文件:

    - 在settings.py中开启管道,且指定使用scrapy-redis中封装好的管道。

ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 400
}

- 该管道默认会连接且将数据存储到本机的redis服务中,如果想要连接存储到其他redis服务中需要在settings.py中进行如下配置:

REDIS_HOST = 'redis服务的ip地址'
REDIS_PORT = 6379
REDIS_ENCODING = ‘utf-8’
REDIS_PARAMS = {‘password’:’123456’}

三.redis分布式部署

  1.scrapy框架是否可以自己实现分布式?

    不可以。原因有二。

      其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls列表中的url。(多台机器无法共享同一个调度器)

      其二:多台机器爬取到的数据无法通过同一个管道对数据进行统一的数据持久出存储。(多台机器无法共享同一个管道)

  2.redis实现分布式基本流程:

    - 使用基于scrapy-redis组件中的爬虫文件。

复制代码
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from movieproject.items import MovieprojectItem
#导入scrapy-redis中的模块
from scrapy_redis.spiders import RedisCrawlSpider

class NnSpider(RedisCrawlSpider):
    name = 'nn' 
    allowed_domains = ['www.id97.com']
    #redis_key表示调度器中的队列(将要爬取的页面数据对应的url都需要放置到调度器队列中)
    redis_key = 'nnspider:start_urls'

    # 根据规则提取所有的页码链接
    page_link = LinkExtractor(allow=r'/movie/\?page=\d')
    detail_link = LinkExtractor(restrict_xpaths='//div[contains(@class,"col-xs-1-5")]/div/a')
    # detail_link = LinkExtractor(allow=r'/movie/\d+\.html$')
    # follow : 是否跟进
    rules = (
        # 所有的页码不用处理,跟进即可
        Rule(page_link, follow=True),
        # 所有的详情页处理,不用跟进
        Rule(detail_link, callback='parse_item', follow=False),
    )

    def parse_item(self, response):
        # 创建一个item对象
        item = MovieprojectItem()
        # 电影海报
        item['post'] = response.xpath('//a[@class="movie-post"]/img/@src').extract_first()
        # 电影名字
        item['name'] = response.xpath('//h1').xpath('string(.)').extract_first()
     
        yield item
复制代码

- 使用scrapy-redis组件中封装好的调度器,将所有的url存储到该指定的调度器中,从而实现了多台机器的调度器共享。

# 使用scrapy-redis组件的去重队列
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 是否允许暂停
SCHEDULER_PERSIST = True

 - 使用scrapy-redis组件中封装好的管道,将每台机器爬取到的数据存储通过该管道存储到redis数据库中,从而实现了多台机器的管道共享。

ITEM_PIPELINES = {

   'scrapy_redis.pipelines.RedisPipeline': 400,
}

- 执行:scrapy runspider xxx.py,然后向调度器队列中传入起始url:lpush 队列名称 start_urls( "http://www.xxx.com/")

 四.分布式流程

复制代码
1.下载scrapy-redis:pip install scrapy-redis
2.创建scrapy工程(爬虫文件:基于scrapy.Spider,基于CrawlSpider)
3.修改爬虫程序:注意,爬虫文件名称一定不可以被注释
    3.1 导入from scrapy_redis.spiders import RedisSpider/RedisCrawlSpider
    3.2 将当前爬虫文件的爬虫类的父类修改成RedisSpider/RedisCrawlSpider
    3.3 allow_domain,start_urls进行注释。
    3.4 添加一个redis_key属性值(调度器队列的名称)。属性值可以自定义。
    3.5 编写解析和请求相关的代码
4.在配置文件中指明,当前工程使用的调度器和管道为scrapy-redis组件中的。
    #管道
    ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 400
    }

    # 使用scrapy-redis组件的去重队列
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    # 使用scrapy-redis组件自己的调度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    # 是否允许暂停
    SCHEDULER_PERSIST = True

5.redis的配置文件进行配置:redis_window_config.cfg
    - bind 127.0.0.1进行注释
    - 关闭保护模式 protected-mode no

6.携带配置文件开启redis服务器
  redis-server.exe redis-windows.conf
7.开启redis客户端 8.在工程中的setings配置文件中进行redis服务器的ip和端口的配置: REDIS_HOST = 'redis服务的ip地址' REDIS_PORT = 6379 REDIS_ENCODING = ‘utf-8’ REDIS_PARAMS = {‘password’:’123456’} 9.运行爬虫文件:进入到爬虫文件对应的目录中(精确到spider下)。scrapy runspider xxx.py 10.向调度器中仍入一个起始url: - redis的客户端中进行操作:lpush redis_key对应的value值 起始url 11.redis服务器中:keys * 查看数据。数据都存储到了xxx:items这个集合中。
复制代码

123 

posted @   老虎死了还有狼  阅读(248)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示