分布式爬虫的完整实现

实现原理

一台主机:作为服务器客户端
其他主机:作为客户端

客户端与服务端的实现:每个客户端的scrapy项目的setting文件中,对REDIS_HOST进行指定,指定的ip即服务端,客户端程序停止并等待服务端Redis输入URL队列,从服务端Redis输入URL队列后,各个客户端开始运行,每个客户端分配不同的URL进行爬取,将爬取结果返回并存储到服务端Redis数据库中。多台客户端即开始执行爬取任务,效率比普通单一爬取的效率要高得多。

实现步骤

本博客,我将实现用本机win10(客户端) + 虚拟机ubuntu-18.04.1(客户端+服务器)进行分布式爬取
(注意:可自行增添虚拟机(数量,版本以及类型),linux和win都行,加大客户端数目,加快爬取效率。配置情况类似,可自行实现。)

虚拟机部分:

  • 搭建一个Ubuntu虚拟机,更新python版本为3.6左右
  • 在Ubuntu中安装相关库(scrapy等)
  • 在Ubuntu中安装Redis数据库,更改Redis数据库允许远程服务配置

本机部分:

  • 在本机上(win10)创建scrapy项目,并创建dbm爬虫对象
  • 更改项目文件中的setting.py配置,新增items.py内部属性,更改dbm.py爬虫文件的参数
  • 更改完成将整个项目文件打包传送一份给虚拟机
  • 安装可视化Redis软件和Redis数据库

运行:

  • 执行客户端项目文件
  • 将URL队列输入到Redis服务端,并执行
  • 爬取开始,整个爬取流程完成

一.scrapy框架的安装

# 进入cmd:
pip install scrapy

二.创建项目

scrapy框架项目的创建需要用命令行来实现

# 进入指定文件夹:
scrapy startproject doubanproject

三.创建爬虫对象

# 进入创建的doubanproject文件夹:
cd doubanproject
# 输入指令创建爬虫对象:
scrapy genspider dbm movie,douban.com

可查看文件目录结构:
在这里插入图片描述

四.更改文件配置

  • 新增items.py文件内部属性
directors = scrapy.Field()
# 评分
rate = scrapy.Field()
# 标题
title = scrapy.Field()
# 详情链接
url = scrapy.Field()
# 图像
cover = scrapy.Field()
# 简介
summary = scrapy.Field()
  • 更改爬虫对象dbm.py文件
    先导入库
from scrapy_redis.spiders import RedisCrawlSpider
from doubanproject.items import DoubanprojectItem

爬虫文件对象结构如下:
此处不在需要起始url,转而为redis_key

class DbmSpider(RedisCrawlSpider):
    name = 'dbm'
    allowed_domains = ['movie.douban.com']
    # start_urls = ['https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=0']
    redis_key = "dbmspider:start_urls"

    # ubuntu往队列中添加起始url: lpush dbmspider:start_urls "https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=0"

    page = 1

    def parse(self, response):
        file_content = json.loads(response.body)
        content = file_content["data"]
        for film in content:
            directors = film["directors"]
            rate = film["rate"]
            title = film["title"]
            url = film["url"]
            cover = film["cover"]

            item = DoubanprojectItem()
            item["directors"] = directors
            item["rate"] = rate
            item["title"] = title
            item["url"] = url
            item["cover"] = cover

            # 跨页
            yield scrapy.Request(url=url, callback=self.details_parse, meta={"item": item}, dont_filter=True)
        # 分页
        self.page += 1
        start = (self.page-1)*20

        next_url = "https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start={}".format(start)

        # if self.page <= 2:
        yield scrapy.Request(url=next_url, callback=self.parse, dont_filter=True)

    def details_parse(self, response):
        item = response.meta["item"]
        summary = response.xpath('//div[@class="indent"]/span/text()').extract_first().strip('\n')
        item["summary"] = summary
        yield item

  • 更改setting文件
# 更改 USER_AGENT配置
USER_AGENT = 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
# 更改是否遵循robot协议
ROBOTSTXT_OBEY = False
# 开启管道,设定管道
ITEM_PIPELINES = {
   'doubanproject.pipelines.DoubanprojectPipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,
}

在尾部增加配置:

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

在尾部继续添加Redis配置:

REDIS_HOST = "XXX.XXX.XXX.XXX"(写自己服务端虚拟机ip地址)
REDIS_PORT = 6379

五.创建并配置虚拟机

  • 查看ip地址

VMware中创建一个Ubuntu虚拟机,查看虚拟机ip地址:

ipconfig # 指令不存在的自行安装

将该ip地址写入上面(setting.py),REDIS_HOST中

  • 更改python版本并指定默认

安装python3,系统自带python2,但不用它:
安装时间有点长,如果安装失败是HTTP / time out问题,则重复操作,直到下载更新全部完成

sudo apt-get update
sudo apt-get install python3

指定系统默认python为python3:

# 备份原python2链接
sudo cp /usr/bin/python /usr/bin/python_bak 
# 删除原系统默认链接
sudo rm /usr/bin/python
# 重新指定新的python链接给系统
sudo ln -s /usr/bin/python3.6 /usr/bin/python 

这里自己装的python版本为多少则自行更改,我装的为python3.6

  • 安装新版vim,便于后续打开文件进行操作
# 删除旧版vim
sudo apt-get remove vim-common
# 安装新版vim
sudo apt-get install vim
  • 安装pip,便于装库
sudo apt-get install python3-pip
  • 通过pip来安装python相关库-scrapy
sudo pip install scrapy
  • 安装Redis,设置用户名
# 安装redis服务器
sudo apt-get install redis-server
# 运行redis客户端(不加端口号,默认本地,也就是虚拟机)
redis-cli

设置客户端名,便于作为name去连接可视化数据库

# 设置客户端名为: mudriscrapy
client setname mydiscrawler
  • 配置redis远程连接
# 1.进入虚拟机cmd,查看redis目录
whereis redis

# 返回结果
/etc/redis
# 2.进入该redis目录
cd /etc/redis
# 查看当前目录(或 ls -l长格式,一行显式一条)
ls

# 返回结果 
redis.conf
# 3.进入配置文件
sudo vi redis.conf

更改保护模式为 no
在这里插入图片描述
屏蔽掉该端口:
在这里插入图片描述

六.可视化数据库进行管理

在本机win10下载 Redis Desktop Manager对Redis进行可视化管理
可视化数据库与Redis进行远程连接:
Name填写上述操作中client setname XXX的内容,此处为mydiscrawler
Host填写要连接的主机ip,此处为虚拟机IP,上面已经展现过
Port默认端口6379
在这里插入图片描述
点击Test Connection测试连接可靠性或直接点击ok来完成连接。

七. 运行项目

将本机doubanproject项目复制一份到Ubuntu,运行本机和虚拟机上的项目:

scrapy runspider dbm.py

客户端基本配置运行完成后,停止并等待

# 向服务端Redis输入起始URL
# 格式
lpush [redis_key [start_url]
# 我的输入
lpush dbmspider:start_urls "https//movie.douban.com"

客户端开始继续运行,爬取数据到Redis,可在可视化Redis中查看

scrapy为一个框架,不能实现分布式
而scrapy-redis是基于这个框架开发的一套组建

基本分布式爬虫已经实现,部分功能还在完善,后续更新…

参考文档:

scrapy-redis框架 github

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值