热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

scrapyredis分布式爬虫






分布式爬虫

目录


分布式爬虫


相关的参考资料


依赖环境


相关介绍


分布式问题


项目中(settings和爬虫文件.py)代码的配置


MySQL和redis的配置


开始分布式爬虫


重启分布式爬虫




相关的参考资料


scrapy-redis库GitHub地址:github地址点击打开


本博客的总结和示例代码下载地址:https://download.csdn.net/download/qq_33472765/10547511


之前关于redis的介绍(包括工具的安装使用)的博客:https://blog.csdn.net/qq_33472765/article/details/80655845


redis操作创建和卸载参考:https://www.cnblogs.com/oneTOinf/p/7928033.html


redis操作的菜鸟教程学习参考:http://www.runoob.com/redis/redis-tutorial.html


依赖环境:


Scrapy >= 1.1


Redis >= 2.8


附:查看ip的命令如下图:


scrapy-redis分布式爬虫


 


相关介绍:


分布式爬虫:将一个项目拷贝到多台电脑上,同时爬取数据。


1. 必须保证所有电脑上的代码是相同的配置。


2. 在其中一台电脑上启动redis和mysql的数据库服务。


3. 同时将所有的爬虫项目运行起来。


4. 在启动redis和mysql数据库的电脑上,向redis中添加起始的url。


 


q = queue()


url = q.get() # 如果队列是空的,那么get()方法会一直阻塞,直到能够获取一个url,才会继续向下执行。


 


 


单机爬虫:一台电脑运行一个项目。去重采用了set()和queue(),但是这两个都是在内存中存在的。1>其他电脑是无法获取另外一台电脑内存中的数据的。2>程序终止,内存消失。


 


分布式问题:


1. 多台电脑如何统一的对URL进行去重?


2. 多台电脑之间如何共用相同的队列?多台电脑获取的request,如何在多台电脑之间进行同步?


3. 多台电脑运行同一个爬虫项目,如果有机器爬虫意外终止,如何保证可以继续从队列中获取新的request,而不是从头开始爬取?


 


前两个问题:可以基于redis实现。相当于将set()和queue()从scrapy框架中抽离出来,将其保存在一个公共的平台中(redis)。


第三个问题:scrapy_redis已经实现了,重启爬虫不会从头开始重新爬取,而是会继续从队列中获取request。不用担心爬虫意外终止。


 


多台电脑的爬虫项目连接同一个redis数据库。


 


scrapy_redis第三方库实现分布的部署:


 


分布式爬虫:只需要在众多电脑中,选择其中一台开启redis服务,目的就是在redis中创建公用的queue和公用的set,然后剩余电脑只需要连接redis服务即可,剩余电脑不需要开启redis-server服务。


 


项目中的配置


注意:配置是命令有可能需要手敲不能粘贴(拼音和英文有区别!!)


下载的scrapy-redis库,并放在项目根目录下,如下图:


scrapy-redis分布式爬虫


 


scrapy-redis分布式爬虫


1>在虚拟环境中安装:pip install redis


scrapy-redis分布式爬虫


2>去github上搜索scrapy-redis库,解压,保存到项目根目录下。根据提供的用例,配置我们的项目,大致三部分:


    1.settings.py文件;


    SCHEDULER = "scrapy_redis.scheduler.Scheduler"


    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"


    ITEM_PIPELINES = {


        'scrapy_redis.pipelines.RedisPipeline': 300


    }


    # myroot: 自定义的redis链接。IP:开启redis-server服务的这台电脑的IP


    REDIS_URL = 'redis://@192.168.40.217:6379'


        


    2.jobbole.py文件(注意:继承类RedisSpider);


    from scrapy_redis.spiders import RedisSpider


    class JobboleSpider(RedisSpider):


             name = 'jobbole'


             allowed_domains = ['jobbole.com']


             # start_urls = ['http://blog.jobbole.com/all-posts/']


        


         # 添加键


             redis_key = 'jobbole:start_urls'


scrapy-redis分布式爬虫


 


相关截图如下:


Settings.py


scrapy-redis分布式爬虫


爬虫文件.py中:


scrapy-redis分布式爬虫


 


MySQL和redis的配置


    3.有关数据库部分,相关数据库中的配置如下;


安装MySQL的时候,默认生成的用户root只有本地登录权限localhost,如果需要远程连接MySQL,需要分配一个拥有远程连接权限的新用户。(MySQL这个相对比较简单:按照顺序操作cmd就好,中间创建的过程有1个warning,可以忽略!!查看数据库中没问题就好!)


 


    开始配置MySQL数据库>>>>


第一步:通过mysql -uroot -p登录MySQL服务。(安装时要配置环境变量,如下图:)


scrapy-redis分布式爬虫


scrapy-redis分布式爬虫


 


    第二步:通过 grant all privileges on *.*  to 'myroot'@'%' identified by '123456';  (注意一定要带上分号)


    # *.* 表示所有数据库中的所有表,都能够被远程连接


    # '%' 表示任意IP都可以进行链接


    # 'myroot' 具有远程链接权限的用户名,自定义。之后就使用这个User进行链接数据库


    mysql->  grant all privileges on *.*  to 'myroot'@'%' identified by '123456';  回车即可(注意一定要带上分号)


    第三步:再去修改爬虫项目中有关数据库的配置。


    MYSQL_HOST = '192.168.40.217'


   MYSQL_DBNAME = 'article_db'


    MYSQL_USER = 'myroot'


    MYSQL_PASSWORD = '123456'


MYSQL_CHARSET = 'utf8'


(注意 :‘MYSQL_HOST =’是局域网的或公网的ip,


‘MYSQL_DBNAME =’是数据库名,


‘MYSQL_USER =’具有远程连接数据库的用户名,


‘MYSQL_PASSWORD =’密码


‘MYSQL_CHARSET =’ 编码格式)


MySQL相关配置如下图:


scrapy-redis分布式爬虫


 


 


3>将配置好的项目,拷贝到不同的机器中;


 


4> Redis数据库相关配置(比较麻烦!)


开始配置redis>>>>


 


注意:首先保证有redis数据库,做之前查看redis中相关的文件如下图:


scrapy-redis分布式爬虫


查看计算机管理->服务:


scrapy-redis分布式爬虫 scrapy-redis分布式爬虫


 


如果服务中没有redis(主要是因为卸载之前的配置造成的)可以在cmd中使用命令:


redis-server --service-install redis.windows.conf


在配置过程中要关闭这个服务(鱼与熊掌的问题)不要自己打开,否则在配置时执行了cmd开启命令:


redis-server.exe redis.windows.conf后再来开启就会报如下错误:


scrapy-redis分布式爬虫会陷入自己的纠结症中!!——可以开启可能是在修改配置后重新启动redis之后命令行Ctrl+C关闭就可以自行手动在服务中打开了,自己没验证过!!!


 


开始配置!!!!!!!!!!!!!!!!


重要——选择其中一台机器,开启redis-server服务,并修改redis.windows.conf(也可以同时修改:redis.windows-service.conf文件)配置文件:


 


# 配置远程IP地址,供其他的电脑进行连接redis


bind: (当前电脑IP) 192.168.40.217


 


# 关闭redis保护模式


protected-mode: no


注意:上面是示例ip,以及修改时别搞错了!!!


scrapy-redis分布式爬虫


 


运行cmd命令如下:


进入redis文件:cd redis文件目录


卸载服务命令(之前使用过redis配置的情况!):redis-server --service-uninstall


卸载后需要在服务中安装redis:redis-server --service-install redis.windows.conf(结合卸载来使用)


启动命令:redis-server.exe  redis.windows.conf


 


启动后:连接redis服务


进入redis项目目录:cd 目录名


连接命令:redis-cli -h 192.168.70.126 -p 6379 (注意:更换ip(公网或局域网的ip),端口一般不变:6379)


在连接成功后查看redis的内部相关存入的信息输入:192.168.70.126> keys  *


不关闭窗口然后输入7中的命令配置爬虫的起始url:lpush bole:start_urls http://blog.jobbole.com/all-posts/ (注意:更换url和配置键名,参考7下面的图!!)


scrapy-redis分布式爬虫


启动后的命令如下图:


scrapy-redis分布式爬虫


 


scrapy-redis分布式爬虫


 


5>其中一台电脑启动redis-server服务


 


开始分布式爬虫


6>让所有爬虫项目都运行起来,由于没有起始的url,所有爬虫会暂时处于停滞状态


 


7>所有爬虫都启动之后,部署redis-server服务的电脑,通过命令redis-cli:


 lpush bole:start_urls http://blog.jobbole.com/all-posts/向redis的queue中添加起始的url


注意:先启动爬虫让爬虫开始等待,然后输入上述命令!!


scrapy-redis分布式爬虫


8>所有爬虫开始运行,爬取数据,同时所有的数据都会保存到该爬虫所连接的远程数据库以及远程redis中


 


注意:不能关闭cmd窗口,如下!!


scrapy-redis分布式爬虫


scrapy-redis分布式爬虫


 


重启分布式爬虫


9〉下次关机后如果需要再次开启,依次执行以下操作:



  1. 进入计算机管理》服务中查看redis服务是否开启(开启的需要关闭!)


  2. Cmd命令进入redis项目目录:cd redis项目目录


  3. 启动命令:redis-server.exe  redis.windows.conf (下面很熟悉!!!)scrapy-redis分布式爬虫

  4. 打开新窗口创建连接如****意:删除之前使用过的键!!--dupefilter)


进入redis项目目录:cd 目录名


连接命令:redis-cli -h 192.168.70.126 -p 6379 (注意:更换ip(公网或局域网的ip),端口一般不变:6379)


在连接成功后查看redis的内部相关存入的信息输入:192.168.70.126> keys  *


注意:删除之前与该爬虫相关的键(使用过的!!)


不关闭窗口再输入7中的命令配置爬虫的起始url:lpush bole:start_urls http://blog.jobbole.com/all-posts/ (注意:更换url和配置键名)


 


注意:不能关闭cmd窗口!!




推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
author-avatar
香福武燕_205
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有