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

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

基于docker+redis++urlib/request的分布式爬虫原理 随笔 第1张

   4.以这个镜像为基础创建新的docker(这个docker是作为center中心调度器,所有信息的读写都在这边,3a54是上面加载进来镜像的id)

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
docker run -tid  --name center 3a54

   5. 查看docker是否在运行

docker ps -a

 6.进入容器并且查看这个docker的ip (center为docker的name)

docke attach center
cat  /etc/hosts

基于docker+redis++urlib/request的分布式爬虫原理 随笔 第2张

 6.配置mysql

1.启动mysql
  /etc/init.d/mysql restart

2.登录(以localhost、127.0.0.1成功登录)
  mysql -u root -p 
 基于docker+redis++urlib/request的分布式爬虫原理 随笔 第3张

3.以本容器的ip登录(不能登录)
  mysql -h 127.0.0.1 -u root -p
  基于docker+redis++urlib/request的分布式爬虫原理 随笔 第4张
  处理:
    修改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
  
基于docker+redis++urlib/request的分布式爬虫原理 随笔 第5张
6.以root 身份以本机登录后创建新的用户(这是因为root用户不允许远程登录,所以需要创建普通用户)
  mysql -h 127.0.0.1 -u root -p
  
基于docker+redis++urlib/request的分布式爬虫原理 随笔 第6张

7.创建用户配置权限
  create user "tom"@"%" identified by "tom";
  grant create,delete,update,select,insert on *.* to tom;
  
基于docker+redis++urlib/request的分布式爬虫原理 随笔 第7张

8.退出mysq,再用普通用户,本机ip登录
  mysql -h 172.17.0.2 -u tom -p 
  
基于docker+redis++urlib/request的分布式爬虫原理 随笔 第8张
  
总结:
  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 #成功
基于docker+redis++urlib/request的分布式爬虫原理 随笔 第9张 基于docker+redis++urlib/request的分布式爬虫原理 随笔 第10张
 
总结:
  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

   基于docker+redis++urlib/request的分布式爬虫原理 随笔 第11张 

  3.查看本机ip和连接主机的ip

cat /etc/hosts

  基于docker+redis++urlib/request的分布式爬虫原理 随笔 第12张

  4.测试子节点和中心节点的连通

#就是在子节点下用中心节点的ip和用户连接中心节点的数据库,都没问题

mysql -h 172.17.0.2 -u tom -p
redis-cli -h 172.17.0.2

  基于docker+redis++urlib/request的分布式爬虫原理 随笔 第13张

  基于docker+redis++urlib/request的分布式爬虫原理 随笔 第14张

 

三.在子节点编写爬虫文件

  编写爬虫文件并且测试可以进行

基于docker+redis++urlib/request的分布式爬虫原理 随笔 第15张
import redis
import pymysql
import urllib.request
import re
#这里的ip是中心节点的ip
rconn=redis.Redis("172.17.0.8","6379")
#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),"1")
    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))
View Code

 

四.增加子节点

  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的分布式爬虫原理 随笔 第17张

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄