一.整体思路及中心节点的配置

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的分布式爬虫原理的更多相关文章

  1. 基于 Scrapy-redis 两种形式的分布式爬虫

    基于 Scrapy-redis 两种形式的分布式爬虫 .caret, .dropup > .btn > .caret { border-top-color: #000 !important ...

  2. Python分布式爬虫原理

    转载 permike 原文 Python分布式爬虫原理 首先,我们先来看看,如果是人正常的行为,是如何获取网页内容的. (1)打开浏览器,输入URL,打开源网页 (2)选取我们想要的内容,包括标题,作 ...

  3. 基于Redis的三种分布式爬虫策略

    前言: 爬虫是偏IO型的任务,分布式爬虫的实现难度比分布式计算和分布式存储简单得多. 个人以为分布式爬虫需要考虑的点主要有以下几个: 爬虫任务的统一调度 爬虫任务的统一去重 存储问题 速度问题 足够“ ...

  4. 基于Python使用scrapy-redis框架实现分布式爬虫

    1.首先介绍一下:scrapy-redis框架 scrapy-redis:一个三方的基于redis的分布式爬虫框架,配合scrapy使用,让爬虫具有了分布式爬取的功能.github地址: https: ...

  5. 17.基于scrapy-redis两种形式的分布式爬虫

    redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...

  6. 基于scrapy-redis两种形式的分布式爬虫

    redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...

  7. 17,基于scrapy-redis两种形式的分布式爬虫

    redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...

  8. Redis、Zookeeper实现分布式锁——原理与实践

    Redis与分布式锁的问题已经是老生常谈了,本文尝试总结一些Redis.Zookeeper实现分布式锁的常用方案,并提供一些比较好的实践思路(基于Java).不足之处,欢迎探讨. Redis分布式锁 ...

  9. 基于(Redis | Memcache)实现分布式互斥锁

    设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存击穿 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则 ...

随机推荐

  1. 32.GROUP BY

    合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 ...

  2. 29.MAX() 函数

    MAX() 函数 MAX 函数返回一列中的最大值.NULL 值不包括在计算中. SQL MAX() 语法 SELECT MAX(column_name) FROM table_name 注释:MIN ...

  3. pandas dataframe 满足条件的样本提取

    pandas 的dataframe 对 数据查询可以通过3种方式 . 预备知识: 1. pandas 的索引和label都是从0开始的计数的 2. 时间切片都是左闭右开的. [5:6,:]  只会输出 ...

  4. java IO 对象流 反序列化和序列化

    例: 重点:需要序列化的对象必须实现Serializable接口 //需要序列化的对象 public class User implements Serializable { private Stri ...

  5. 编写高质量代码改善C#程序的157个建议——建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理

    建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理 在标准的Dispose模式中,我们注意到一个以~开头的方法,如下: /// <summary> /// 必须,防止程序员忘记 ...

  6. 删除一个数的K位使原数变得最小

    原创 给定一个n位正整数a, 去掉其中k个数字后按原左右次序将组成一个新的正整数.对给定的a, k寻找一种方案,使得剩下的数字组成的新数最小. 提示:应用贪心算法设计求解 操作对象为n位正整数,有可能 ...

  7. 浅谈短视频APP的发展趋势

    2014年6月20日,在AppAnnie最新发布5月应用指数中,美拍荣登“非游戏类iOS榜单”全球下载量第一位置,成为全球iOS应用商店最热门APP.能在<AppAnnie应用指数>这份A ...

  8. xmlreader与xmlwriter里的几个坑与解决方案

    加载超过100M的xml文件时(可能不是很常见),XmlDocument这种全部加载到内存里的模式就有点不友好了,耗时长.内存高. 这时用xmlreader就会有自行车换超跑的感觉,但其间遇到几个坑, ...

  9. 【C#】LINQ

    一.什么是LINQ 长期以来,开发社区形成以下的格局: 1.面向对象与数据访问两个领域长期分裂,各自为政. 2.编程语言中的数据类型与数据库中的数据类型形成两套不同的体系,例如: C#中字符串用str ...

  10. OOP2(虚函数/抽象基类/访问控制与继承)

    通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当 ...