基于docker+redis++urlib/request的分布式爬虫原理
一.整体思路及中心节点的配置
1.首先在虚拟机中运行一个docker,docker中运行的是一个linux系统,里面有我们所有需要的东西,linux系统,python,mysql,redis以及一些python的库如request、urllib等,
最好把这个做成一个镜像文件
docker save -o 文文件名 镜像id
2.我们把上面的镜像文件还原为一个镜像:
docker load --input 文件名
3.docker images查看一下是否有多出来一个image
docker images

4.以这个镜像为基础创建新的docker(这个docker是作为center中心调度器,所有信息的读写都在这边,3a54是上面加载进来镜像的id)
docker run -tid --name center 3a54
5. 查看docker是否在运行
docker ps -a
6.进入容器并且查看这个docker的ip (center为docker的name)
docke attach center
cat /etc/hosts

6.配置mysql
1.启动mysql
/etc/init.d/mysql restart 2.登录(以localhost、127.0.0.1成功登录)
mysql -u root -p
3.以本容器的ip登录(不能登录)
mysql -h 127.0.0.1 -u root -p
处理:
修改mysql的启动配置文件:
vim /etc/mysql/my.cnf #把bing 127.0.0.1这一行注释掉,这样一来他就不仅仅只监听本机的ip,外网ip也会监听
4.再次重启(修改过配置文件,要以新的配置启动)
/etc/init.d/mysql restart 5.重复第三步(修改丙丁ip后还是不能登录)
mysql -h 127.0.0.1 -u root -p

6.以root 身份以本机登录后创建新的用户(这是因为root用户不允许远程登录,所以需要创建普通用户)
mysql -h 127.0.0.1 -u root -p

7.创建用户配置权限
create user "tom"@"%" identified by "tom";
grant create,delete,update,select,insert on *.* to tom;

8.退出mysq,再用普通用户,本机ip登录
mysql -h 172.17.0.2 -u tom -p

总结:
1.修改配置文件的bind
2。创建普通用户
7. 配置redis
1.启动redis
/etc/init.d/resdis-server
2.连接redis
redis-cli
3.以本机ip连接
redis-cli -h 172.17.0.2 #不成功
4.修改配置文件
vim /etc/redis/redis.conf
#同样把bind 127.0.0.1给注释掉
5.重启
/etc/init.d/resdis-server
6.再用本机ip登录
redis-cli -h 172.17.0.2 #不成功
7.退出容器
ctrl+P+q
8.停止容器
docker stop e5da
9.再次开启容器
docker start e5da
10.进入容器
docker attach e5da
11.重启redis
/etc/init.d/resdis-server
12.再次以本机ip登录 redis-cli -h 172.17.0.2 #成功


总结:
1.修改配置文件,修改绑定的端口 #bind 127.0.0.1 注释
2.重启容器
1.一定要以ctrl+p+q退出
2.docker stop id
3.docker start id
4.docker attach id
5.启动redis
6.连接redis redis-cli
二.子节点的配置
1.退出中心节点的容器(不停止运行)
crtrl + p + q
2.创建子节点并且进入
#创建名为c1的自己节点,并且连接到center这个节点的docker,以3a54(和中心节点一样)的镜像创建
docker run -tid --name c1 ---link center 3a54
3.查看本机ip和连接主机的ip
cat /etc/hosts

4.测试子节点和中心节点的连通
#就是在子节点下用中心节点的ip和用户连接中心节点的数据库,都没问题 mysql -h 172.17.0.2 -u tom -p
redis-cli -h 172.17.0.2


三.在子节点编写爬虫文件
编写爬虫文件并且测试可以进行
import redis
import pymysql
import urllib.request
import re
#这里的ip是中心节点的ip
rconn=redis.Redis("172.17.0.8","")
#url:http://www.17k.com/book/2.html
'''
url-i-"1"
'''
for i in range(0,5459058):
#先判断url是否怕取过进行过就过掉
isdo=rconn.hget("url",str(i))
if(isdo!=None):
continue
#没有爬取就,做个标志并且进爬取
rconn.hset("url",str(i),"")
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]
rconn.hset("rst",str(i),str(name))
四.增加子节点
1.退出子节点容器并且停止容器运行
exit
2.把上面子节点容器封装成一个镜像
#docker commit 容器id 名称:tag
docker commit bee8 crwl:abc
3.用子节点容器鞥装好的镜像创建新的docker
docker run -tid --name c2 --link center 56bc
docker run -tid --name c3 --link center 56bc
docker run -tid --name c4 --link center 56bc
4.分别进入子节点编写爬虫文件并且启动

基于docker+redis++urlib/request的分布式爬虫原理的更多相关文章
- 基于 Scrapy-redis 两种形式的分布式爬虫
基于 Scrapy-redis 两种形式的分布式爬虫 .caret, .dropup > .btn > .caret { border-top-color: #000 !important ...
- Python分布式爬虫原理
转载 permike 原文 Python分布式爬虫原理 首先,我们先来看看,如果是人正常的行为,是如何获取网页内容的. (1)打开浏览器,输入URL,打开源网页 (2)选取我们想要的内容,包括标题,作 ...
- 基于Redis的三种分布式爬虫策略
前言: 爬虫是偏IO型的任务,分布式爬虫的实现难度比分布式计算和分布式存储简单得多. 个人以为分布式爬虫需要考虑的点主要有以下几个: 爬虫任务的统一调度 爬虫任务的统一去重 存储问题 速度问题 足够“ ...
- 基于Python使用scrapy-redis框架实现分布式爬虫
1.首先介绍一下:scrapy-redis框架 scrapy-redis:一个三方的基于redis的分布式爬虫框架,配合scrapy使用,让爬虫具有了分布式爬取的功能.github地址: https: ...
- 17.基于scrapy-redis两种形式的分布式爬虫
redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...
- 基于scrapy-redis两种形式的分布式爬虫
redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...
- 17,基于scrapy-redis两种形式的分布式爬虫
redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...
- Redis、Zookeeper实现分布式锁——原理与实践
Redis与分布式锁的问题已经是老生常谈了,本文尝试总结一些Redis.Zookeeper实现分布式锁的常用方案,并提供一些比较好的实践思路(基于Java).不足之处,欢迎探讨. Redis分布式锁 ...
- 基于(Redis | Memcache)实现分布式互斥锁
设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存击穿 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则 ...
随机推荐
- 32.GROUP BY
合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 ...
- 29.MAX() 函数
MAX() 函数 MAX 函数返回一列中的最大值.NULL 值不包括在计算中. SQL MAX() 语法 SELECT MAX(column_name) FROM table_name 注释:MIN ...
- pandas dataframe 满足条件的样本提取
pandas 的dataframe 对 数据查询可以通过3种方式 . 预备知识: 1. pandas 的索引和label都是从0开始的计数的 2. 时间切片都是左闭右开的. [5:6,:] 只会输出 ...
- java IO 对象流 反序列化和序列化
例: 重点:需要序列化的对象必须实现Serializable接口 //需要序列化的对象 public class User implements Serializable { private Stri ...
- 编写高质量代码改善C#程序的157个建议——建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理
建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理 在标准的Dispose模式中,我们注意到一个以~开头的方法,如下: /// <summary> /// 必须,防止程序员忘记 ...
- 删除一个数的K位使原数变得最小
原创 给定一个n位正整数a, 去掉其中k个数字后按原左右次序将组成一个新的正整数.对给定的a, k寻找一种方案,使得剩下的数字组成的新数最小. 提示:应用贪心算法设计求解 操作对象为n位正整数,有可能 ...
- 浅谈短视频APP的发展趋势
2014年6月20日,在AppAnnie最新发布5月应用指数中,美拍荣登“非游戏类iOS榜单”全球下载量第一位置,成为全球iOS应用商店最热门APP.能在<AppAnnie应用指数>这份A ...
- xmlreader与xmlwriter里的几个坑与解决方案
加载超过100M的xml文件时(可能不是很常见),XmlDocument这种全部加载到内存里的模式就有点不友好了,耗时长.内存高. 这时用xmlreader就会有自行车换超跑的感觉,但其间遇到几个坑, ...
- 【C#】LINQ
一.什么是LINQ 长期以来,开发社区形成以下的格局: 1.面向对象与数据访问两个领域长期分裂,各自为政. 2.编程语言中的数据类型与数据库中的数据类型形成两套不同的体系,例如: C#中字符串用str ...
- OOP2(虚函数/抽象基类/访问控制与继承)
通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当 ...
3.以本容器的ip登录(不能登录)