热门标签 | 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窗口!!




推荐阅读
  • 使用Python模拟登录教务系统抓取成绩并分析存储
    本文详细介绍如何使用Python编程语言模拟登录学校教务系统,抓取学生的成绩信息,并进行数据分析和可视化处理,最终将数据存储到MySQL数据库中。 ... [详细]
  • SonarQube配置与使用指南
    本文档详细介绍了SonarQube的配置方法及使用流程,包括环境准备、样本分析、数据库配置、项目属性文件解析以及插件安装等内容,适用于具有Linux基础操作能力的用户。 ... [详细]
  • 解决MySQL Administrator 登录失败问题
    本文提供了解决在使用MySQL Administrator时遇到的登录错误的方法,包括启动变量和服务部分禁用的问题。同时,文章还介绍了通过安全配置模式来解决问题的具体步骤。 ... [详细]
  • 本文档详细介绍了服务器与应用系统迁移的策略与实施步骤。迁移不仅涉及数据的转移,还包括环境配置、应用兼容性测试等多个方面,旨在确保迁移过程的顺利进行及迁移后的系统稳定运行。 ... [详细]
  • 解决PHP与MySQL之间的编码不匹配问题
    探讨如何有效解决PHP与MySQL之间常见的编码问题,确保数据的正确传输与显示。 ... [详细]
  • 本文档整理了公司内部常用的网站链接和重要资源路径,包括部门周报、内控报销系统、邮件服务等,同时提供了相关数据库的登录信息。 ... [详细]
  • 本文详细介绍了MySQL 5.5及以上版本中事务管理的全过程,包括事务的启动、设置、锁机制以及解锁方法,旨在为开发者提供一个清晰、全面的操作指南,避免因网络资料分散而导致的学习障碍。 ... [详细]
  • 深入理解Redis集群机制
    本文旨在深入探讨Redis集群的工作原理,包括其架构设计、数据分布策略、节点通信及故障恢复机制等方面的内容。 ... [详细]
  • 本文详细介绍了如何解决在使用本地SQlyog客户端尝试连接阿里云上的MariaDB数据库时遇到的2003错误,即无法连接到MySQL服务器的问题。 ... [详细]
  • 1.选择一个翻译页面,我选择的是有道词典(http:dict.youdao.com)2.随便输入一个英语单词进行翻译,然后查看源文件,找到 ... [详细]
  • C#爬虫Fiddler插件开发自动生成代码
    哈喽^_^一般我们在编写网页爬虫的时候经常会使用到Fiddler这个工具来分析http包,而且通常并不是分析一个包就够了的,所以为了把更多的时间放在分析http包上,自动化生成 ... [详细]
  • 成为一名高效的Java架构师不仅需要掌握高级Java编程技巧,还需深入理解JVM的工作原理及其优化方法。此外,对池技术(包括对象池、连接池和线程池)的应用、多线程处理、集合对象的内部机制、以及常用的数据结构和算法的精通也是必不可少的。同时,熟悉Linux操作系统、TCP/IP协议栈、HTTP协议等基础知识,对于构建高效稳定的系统同样重要。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置单节点的Redis服务,包括下载、解压、编译安装以及启动服务的具体步骤。 ... [详细]
  • 深入探讨Web服务器与动态语言的交互机制:CGI、FastCGI与PHP-FPM
    本文详细解析了Web服务器(如Apache、Nginx等)与动态语言(如PHP)之间通过CGI、FastCGI及PHP-FPM进行交互的具体过程,旨在帮助开发者更好地理解这些技术背后的原理。 ... [详细]
  • 帝国cms各数据表有什么用
    CMS教程|帝国CMS帝国cmsCMS教程-帝国CMS精易编程助手源码,ubuntu桥接设置,500错误是tomcat吗,爬虫c原理,php会话包括什么,营销seo关键词优化一般多 ... [详细]
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社区 版权所有