scrapy-Redis分布式

1、分布式爬虫

        是由一组通过网络进行通信,为了完成共同的爬虫任务而协调工作的计算机节点组成的系统。分布式爬虫是将多台电脑组合起来,共同完成一个爬虫任务,大大提高爬虫效率。

2、为什么需要分布式爬虫?

Scrapy-Redis

      默认情况下scrapy是不支持分布式的,需要使用基于redis的组件Scrapy-Redis组件才能实现分布式。下载地址:https://github.com/rmax/scrapy-redis.git

正常scrapy单机爬虫

3、安装

pip install scrapy-redis

scrapy-redis提供的四种组件

  • Scheduler(调度器)
  • Duplication Filter(去重)
  • item Pipeline(管道)
  • Base Spider(爬虫类)

博客:

4、分布式爬虫工作流程

 5、Scrapy-Redis模块

参考:Scrapy-redis分布式爬虫详解 - 简书1. 分布式爬虫原理 Scrapy单机爬虫有一个本地爬取队列Queue,如果新的Request生成就会放到队列里面,随后Request被Scheduler调度,之后Reque...https://www.jianshu.com/p/14d7ebf74cf0

目录文件说明:

  • __init__.py:用于实现与Redis数据库的连接
  • connection.py:用于连接Redis数据库,在该文件中,get_redis_from_settings()函数用于获取Scrapy配置文件中的配置信息,get_redis()函数用于实现与Redis数据库的链接。
  • defaults.py:用于判断重复数据,该文件中重写了Scrapy中的判断重复爬取的功能,将已经爬取的请求地址(URL)按照规则写入Redis数据库中。
  • picklecompat.py:将数据转换为序列化格式的数据,解决对Redis数据库的写入格式问题。
  • pipelines.py:与Scrapy中的pipelines是同一对象,用于实现数据库的连接以及数据的写入。
  • queue.py:用于实现分布式爬虫的任务队列。
  • scheduler.py:用于实现分布式爬虫的调度工作。
  • spiders.py:重写Scrapy中原有的爬取方式
  • utils.py:设置编码方式,用于更好的兼容Python的其他版本

6、实现分布式爬虫的具体步骤 

        Redis和Mysql数据地址默认设置为本地连接,如果想实现多台计算机共同启动分布式爬虫时,需要将默认的localhost修改为数据库的服务器地址。

  • 通过'ipconfig'命令获取计算机的IP地址

  • Redis数据库情况下是不允许其他计算机进行访问的,需要修改'redis.windows-service.conf'文件。绑定计算机的IP地址。然后重新启动redis服务。

  • mysql数据库实现远程连接:

    • 打开"Mysql Command Line Client"窗口,输入数据库连接密码,接着数据'use mysql',回车。

    • 输入"update user set host='%' where user = 'root'",回车

    • 最后输入'flush privileges'

  • 在两台计算机A和B中,分别运行'distributed'分布式爬虫项目

7、如何把普通的Scrapy项目改写成分布式

案例:
  • 创建项目
scrapy startproject scrapyRedisDemo
  • 创建爬虫
cd scrapyRedisDemo
scrapy genspider httpbin http://httpbin.org/get
  • 修改爬虫类文件
1、导入类并修改继承类
from scrapy_redis.spiders import RedisSpider # 导入类并继承
# class HttpbinSpider(scrapy.spider) 改成:class HttpbinSpider(RedisSpider):
class HttpbinSpider(RedisSpider):
    name = 'httpbin'
    allowed_domains = ['httpbin.org']
    # start_urls = ['http://httpbin.org/']
    redis_key = 'myspider'

    def make_requests_from_url(self, url):
        return scrapy.Request(url, dont_filter=True)

    def parse(self, response):
        print('response:',response.text)
2、注销start_url添加redis_key


  • 修改配置文件
3、修改配置文件,将scrapy_redis包中的settings.py的以下参数拷贝下来
# 需要改
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'
# 指定去重方式 给请求对象去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 设置调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 队列中的内容是否进行持久保留 True redis关闭的时候数据会保留
# False 不会保留
SCHEDULER_PERSIST = True
# 将数据保存到redis中
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 400,
}
配置redis
REDIS_URL = 'redis://127.0.0.1:6379'
  • 创建运行项目的文件并进行运行
from scrapy import cmdline
cmdline.execute('scrapy crawl httpbin'.split())
  • 启动redis-server(服务端)和redis-cli(客户端),在客户端里往redis队列中插入请求地址:lpush myspider 请求地址

       这样,在pycharm里可以看到,每往redis里添加一个请求连接,就会请求一次。可以试着在两台电脑上进行同时爬取数据。

如果遇到以下错误:

解决方法:

def make_requests_from_url(self, url):
        return scrapy.Request(url, dont_filter=True)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小马哥-码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值