scrapy-redis分布式爬虫

分布式爬虫

目录

分布式爬虫

相关的参考资料

依赖环境

相关介绍

分布式问题

项目中(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的命令如下图:

 

相关介绍:

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

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库,并放在项目根目录下,如下图:

 

1>在虚拟环境中安装:pip install 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'

 

相关截图如下:

Settings.py

爬虫文件.py中:

 

MySQL和redis的配置

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

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

 

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

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

 

    第二步:通过 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相关配置如下图:

 

 

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

 

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

开始配置redis>>>>

 

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

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

 

 

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

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

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

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

会陷入自己的纠结症中!!——可以开启可能是在修改配置后重新启动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,以及修改时别搞错了!!!

 

运行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下面的图!!)

启动后的命令如下图:

 

 

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

 

开始分布式爬虫

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

 

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

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

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

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

 

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

 

重启分布式爬虫

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

  1. 进入计算机管理》服务中查看redis服务是否开启(开启的需要关闭!)
  2. Cmd命令进入redis项目目录:cd redis项目目录
  3. 启动命令:redis-server.exe  redis.windows.conf (下面很熟悉!!!)
  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窗口!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值