前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫系列(17)Scrapy 框架-分布式Scrapy-Redis以及Scrapyd的安装使用。

爬虫系列(17)Scrapy 框架-分布式Scrapy-Redis以及Scrapyd的安装使用。

作者头像
野原测试开发
发布2019-07-10 18:09:42
1.5K0
发布2019-07-10 18:09:42
举报
文章被收录于专栏:技术探究

1. 介绍scrapy-redis框架

scrapy-redis

> 一个三方的基于redis的分布式爬虫框架,配合scrapy使用,让爬虫具有了分布式爬取的功能。

github地址:https://github.com/darkrho/scrapy-redis

2. 分布式原理

scrapy-redis实现分布式,其实从原理上来说很简单,这里为描述方便,我们把自己的**核心服务器**称为**master**,而把用于**跑爬虫程序**的机器称为**slave**

我们知道,采用scrapy框架抓取网页,我们需要首先给定它一些start_urls,爬虫首先访问start_urls里面的url,再根据我们的具体逻辑,对里面的元素、或者是其他的二级、三级页面进行抓取。而要实现分布式,我们只需要在这个starts_urls里面做文章就行了

我们在**master**上搭建一个**redis数据库**`(注意这个数据库只用作url的存储),并对每一个需要爬取的网站类型,都开辟一个单独的列表字段。通过设置slave上scrapy-redis获取url的地址为master地址。这样的结果就是,**尽管有多个slave,然而大家获取url的地方只有一个,那就是服务器master上的redis数据库**

并且,由于scrapy-redis**自身的队列机制**,slave获取的链接不会相互冲突。这样各个slave在完成抓取任务之后,再把获取的结果汇总到服务器上

**好处**

程序移植性强,只要处理好路径问题,把slave上的程序移植到另一台机器上运行,基本上就是复制粘贴的事情

3.分布式爬虫的实现

1. 使用三台机器,一台是win10,两台是centos6,分别在两台机器上部署scrapy来进行分布式抓取一个网站

2. win10的ip地址为192.168.31.245,用来作为redis的master端,centos的机器作为slave

3. master的爬虫运行时会把提取到的url封装成request放到redis中的数据库:“dmoz:requests”,并且从该数据库中提取request后下载网页,再把网页的内容存放到redis的另一个数据库中“dmoz:items”

4. slave从master的redis中取出待抓取的request,下载完网页之后就把网页的内容发送回master的redis

5. 重复上面的3和4,直到master的redis中的“dmoz:requests”数据库为空,再把master的redis中的“dmoz:items”数据库写入到mongodb中

6. master里的reids还有一个数据“dmoz:dupefilter”是用来存储抓取过的url的指纹(使用哈希函数将url运算后的结果),是防止重复抓取的

4. scrapy-redis框架的安装

代码语言:javascript
复制
pip install scrapy-redis

5. 部署scrapy-redis

5.1 slave端

> 在windows上的settings.py文件的最后增加如下一行

代码语言:javascript
复制
REDIS_HOST = 'localhost' #master IP

REDIS_PORT = 6379

配置好了远程的redis地址后启动两个爬虫(启动爬虫没有顺序限制)

6 给爬虫增加配置信息

代码语言:javascript
复制
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"


ITEM_PIPELINES = {
    'example.pipelines.ExamplePipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,
}

7 运行程序

7.1 运行slave

代码语言:javascript
复制
scrapy runspider 文件名.py

开起没有先后顺序

7.2 运行master

代码语言:javascript
复制
lpush (redis_key)  url #括号不用写

**说明**

  • - 这个命令是在redis-cli中运行
  • - redis_key 是 spider.py文件中的redis_key的值
  • - url 开始爬取地址,不加双引号

8 数据导入到mongodb中

等到爬虫结束后,如果要把数据存储到mongodb中,就应该修改master端process_items.py文件,如下

代码语言:javascript
复制
import redis


import pymongo


def main():


    r = redis.Redis(host='192.168.31.245',port=6379,db=0)


    client = pymongo.MongoClient(host='localhost', port=27017)


    db = client.dmoz


    sheet = db.sheet


    while True:




        source, data = r.blpop(["dmoz:items"])


        item = json.loads(data)


        sheet.insert(item)


if __name__ == '__main__':


    main()

9 数据导入到MySQL中

等到爬虫结束后,如果要把数据存储到mongodb中,就应该修改master端process_items.py文件,如下

代码语言:javascript
复制
import redis
import pymysql
import json
def process_item():
    r_client = redis.Redis(host="127.0.0.1",port=6379,db =0)
    m_client = pymysql.connect(host="127.0.0.1",port=3306,user="root",passowrd="123456",db="lianjia")
    source,data =r_client.blpop("lianjia:item")
    item = json.loads(data)


    cursor = m_client.cursor()
    values = []
    cursor.execute(sql,values)

10 setting文件配置

代码语言:javascript
复制
#启用Redis调度存储请求队列
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
 
#确保所有的爬虫通过Redis去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
 
#默认请求序列化使用的是pickle 但是我们可以更改为其他类似的。PS:这玩意儿2.X的可以用。3.X的不能用
#SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"
 
#不清除Redis队列、这样可以暂停/恢复 爬取
#SCHEDULER_PERSIST = True
 
#使用优先级调度请求队列 (默认使用)
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'
#可选用的其它队列
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.FifoQueue'
#SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.LifoQueue'
 
#最大空闲时间防止分布式爬虫因为等待而关闭
#这只有当上面设置的队列类是SpiderQueue或SpiderStack时才有效
#并且当您的蜘蛛首次启动时,也可能会阻止同一时间启动(由于队列为空)
#SCHEDULER_IDLE_BEFORE_CLOSE = 10
 
#将清除的项目在redis进行处理
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 300
}
 
#序列化项目管道作为redis Key存储
#REDIS_ITEMS_KEY = '%(spider)s:items'
 
#默认使用ScrapyJSONEncoder进行项目序列化
#You can use any importable path to a callable object.
#REDIS_ITEMS_SERIALIZER = 'json.dumps'
 
#指定连接到redis时使用的端口和地址(可选)
#REDIS_HOST = 'localhost'
#REDIS_PORT = 6379
 
#指定用于连接redis的URL(可选)
#如果设置此项,则此项优先级高于设置的REDIS_HOST 和 REDIS_PORT
#REDIS_URL = 'redis://user:pass@hostname:9001'
 
#自定义的redis参数(连接超时之类的)
#REDIS_PARAMS  = {}
 
#自定义redis客户端类
#REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient'
 
#如果为True,则使用redis的'spop'进行操作。
#如果需要避免起始网址列表出现重复,这个选项非常有用。开启此选项urls必须通过sadd添加,否则会出现类型错误。
#REDIS_START_URLS_AS_SET = False
 
#RedisSpider和RedisCrawlSpider默认 start_usls 键
#REDIS_START_URLS_KEY = '%(name)s:start_urls'
 
#设置redis使用utf-8之外的编码
#REDIS_ENCODING = 'latin1'

11 Scrapyd的安装及使用

11.1 安装scrapyd

代码语言:javascript
复制
pip install scrapyd 

11.2 安装setuptools

> 为什么要安装这个工具?

因为部署的应用需要打包成*.egg才能运行

官网地址:https://pypi.python.org/pypi/setuptools 下载

代码语言:javascript
复制
pip install setuptools-38.5.2-py2.py3-none-any

11.3 部署工程

11.3.1 创建项目

> 工程下会有一个叫scrapy.cfg的文件,文件的内容如下:

代码语言:javascript
复制
[settings]
default = my_spider.settings

[deploy:demo]  # demo是指这个deploy的名称,自己命名,可以多个。(后面有用到) 
#url = http://localhost:6800/
project = my_spider  # 工程的名称

11.3.2 启动scrapyd

> 在本工程下命令行下启动scrapyd

**注意:**

  • 如果不先启动scrapyd就会无法部署工程

11.3.3 部署项目

> 通过scrapyd-deploy部署,要求装一个scrapyd-client

代码语言:javascript
复制
pip install scrapyd-client

11.3.4 配置scrapyd-deploy

在 %python_home%\Scripts下增加一个scrapyd-deploy.bat文件,内容如下:

代码语言:javascript
复制
@echo off 
"%python_home%\python.exe" "%python_home%\Scripts\scrapyd-deploy" %1 %2 %3 %4 %5 %6 %7 %8 %9

11.3.5 使用scrapyd-deploy

代码语言:javascript
复制
scrapy-deploy demo  #demo就是scrapy.cfg中的名字

11.4 运行Spider

代码语言:javascript
复制
curl http://localhost:6800/schedule.json -d project=项目名 -d spider=爬虫名

11.5 查看效果

在浏览器输入 localhost:6800

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 离不开的网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档