Scrapy-redis 分布式
分布式:
架构方式
多台真实机器+爬虫(如requests,scrapy等)+任务共享中心
多台虚拟机器(或者部分虚拟部分真实)+爬虫(如requests,scrapy等)+任务共享中心
多台容器级虚拟化机器(或者部分真实机器)+爬虫(如requests,scrapy等)+任务共享中心
docker+redis+requests+(mysql)
docker+redis+scrapy+scrapy-redis+r(mysql)
中心节点:任务控制-通信redis,数据存储mysql
rconn=redis.Redis("118.31.46.101","6379") #连接中心节点redis
for i in range(0,5459058):
isdo=rconn.hget("url",str(i))
if(isdo!=None): #先取出当前url判断是否爬取过
continue
rconn.hset("url",str(i),"1") #如没有爬过,先把url标记
try:
data=urllib.request.urlopen("http://www.17k.com/book/"+str(i)+".html").read().decode("utf-8","ignore")
except Exception as err:
print(str(i)+"----"+str(err))
continue
pat='<a class="red" .*?>(.*?)</a>'
rst=re.compile(pat,re.S).findall(data)
if(len(rst)==0):
continue
name=rst[0]
print(str(i)+"-----"+str("ok"))
rconn.hset("rst",str(i),str(name)) #当前url爬完后,把数据保存
scrapy-redis
pip3 install scrapy-redis
scrapy-redis中queue三种方式:
SpiderQueue = FifoQueue #先进先出
SpiderStack = LifoQueue #后进先出
SpiderPriorityQueue = PriorityQueue #优先队列,默认
scrapy-redis分布式部署:
中心节点安装redis,(mysql)
各子节点均安装python,scrapy,scrapy-redis,python的redis模块,(pymysql)
将修改好的分布式爬虫项目部署到各子节点
各子节点分别运行分布式爬虫项目
一.修改爬虫文件
1.导入scrapy-redis模块:from scrapy_redis.spiders import RedisSpider
2.将当前爬虫类的父类修改成RedisSpider
3.将allowed_domains和start_urls进行删除
4.添加一个新的属性redis_key = 'xxx',该属性值表示的就是可以被共享的调度器队列的名称
二.进行配置文件的配置
1.保证爬虫文件发起的请求都会被提交到可以被共享的调度器的队列中
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
2.保证爬虫文件提交的item会被存储到可以被共享的管道中
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400
}
3.配置最终数据存储的redis数据库
REDIS_HOST = 'redis服务的ip地址'
REDIS_PORT = 6379
REDIS_ENCODING = 'utf-8'
REDIS_PARAMS = {'password':'123456dj'}
4.redis数据库的配置文件进行配置:关闭保护模式和注释掉bind 127.0.0.1
5.开启redis服务和客户端
6.执行爬虫文件:scrapy runspider xxx.py
7.向调度器队列中仍入一个起始的url:
settings:
#使用的是可以被共享的调度器
# 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
SCHEDULER_PERSIST = True
#使用scrapy-redis中封装好的可以被共享的管道
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400
}
#配置redis
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
REDIS_ENCODING = 'utf-8'
# REDIS_PARAMS = {‘password’:’123456’}
Scrapy-redis 分布式的更多相关文章
- 爬虫--scrapy+redis分布式爬取58同城北京全站租房数据
作业需求: 1.基于Spider或者CrawlSpider进行租房信息的爬取 2.本机搭建分布式环境对租房信息进行爬取 3.搭建多台机器的分布式环境,多台机器同时进行租房数据爬取 建议:用Pychar ...
- scrapy简单分布式爬虫
经过一段时间的折腾,终于整明白scrapy分布式是怎么个搞法了,特记录一点心得. 虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘.有能人改变了scrapy的队列调度,将起始的网 ...
- scrapy之分布式
分布式爬虫 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取. 原生的scrapy是不可以实现分布式爬虫? a) 调度器无法共享 b) 管道无法共享 工具 scrapy-redis组件: ...
- 16 Scrapy之分布式爬虫
redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...
- Redis分布式集群几点说道
原文地址:http://www.cnblogs.com/verrion/p/redis_structure_type_selection.html Redis分布式集群几点说道 Redis数据量日益 ...
- 基于redis分布式缓存实现(新浪微博案例)
第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来 ...
- 一致性Hash算法在Redis分布式中的使用
由于redis是单点,但是项目中不可避免的会使用多台Redis缓存服务器,那么怎么把缓存的Key均匀的映射到多台Redis服务器上,且随着缓存服务器的增加或减少时做到最小化的减少缓存Key的命中率呢? ...
- 基于redis分布式缓存实现
Redis的复制功能是完全建立在之前我们讨论过的基 于内存快照的持久化策略基础上的,也就是说无论你的持久化策略选择的是什么,只要用到了Redis的复制功能,就一定会有内存快照发生,那么首先要注意你 的 ...
- Redis分布式
昨天公司技术大牛做了一个Redis分布式的技术分享: Redis分布式资源: http://redis.io/topics/cluster-tutorialhttp://redis.io/topics ...
- Redis分布式部署,一致性hash
一致性哈希 由于hash算法结果一般为unsigned int型,因此对于hash函数的结果应该均匀分布在[0,2^32-1]区间,如果我们把一个圆环用2^32 个点来进行均匀切割,首先按照hash( ...
随机推荐
- Entity Framework Core系列之DbContext
前言: EF Core DbContext表示与数据库的会话,并提供与数据库通信的API,具有以下功能: 数据库连接 数据操作,如查询和持久化 更改追踪 模型构建 数据映射 对象缓存 事务管理 数据库 ...
- 页面跳转时,url 传大数据的参数不全的问题+序列化对象
1.页面跳转时,url 传大数据的参数不全的问题 //传参: url: '/pages/testOfPhysical/shareEvaluation?detailInfo=' +encodeURICo ...
- OpenStack-Keystone(2)
一. Keystone 概述 管理用户及其权限 维护OpenStack Services的Endpoint Authentication(认证)和 Authorization(授权) 1.验证用户 验 ...
- python json数据的转换
1 Python数据转json字符串 import json json_str = json.dumps(py_data) 参数解析: json_str = json.dumps(py_data,s ...
- Basic GC Tuning
Sizing the Heap -XmsN -XmxN Summary The JVM will attempt to find a reasonable minimum and maximum he ...
- SpringMVC DispatcherServlet在配置Rest url-pattern的一点技巧
SpringMVC的Controller中已经有了@RequestMapping(value = "detail.do", method = RequestMethod.GET)的 ...
- libavcodev may be vulnerable or is not supported, and should be updated for play video
media.libavcodec.allow-obsolete
- ORM关于表那些事
一.. ORM表和表之间的关系 1. 一对多 --> 外键(ForeignKey) 2. 多对多 --> 另外一张关系表(ManyToManyField) 1. 三种方式 1. 自己建立第 ...
- 【nowcoder-2017校招真题】保留最大的数
牛客在线编程-保留最大的数 题目描述 给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大. 输入描述: 输入为两行内容,第一行是正整数number,1 ≤ ...
- 了解PID控制
@2019-03-07 [小记] 了解PID控制 比例 - 积分 - 微分 积分 --- 记忆过去 比例 --- 了解现在 微分 --- 预测未来