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

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. Luogu 4755 Beautiful Pair

    分治 + 主席树. 设$solve(l, r)$表示当前处理到$[l, r]$区间的情况,我们可以找到$[l, r]$中最大的一个数的位置$mid$,然后扫一半区间计算一下这个区间的答案. 注意,这时 ...

  2. Mysql处理海量数据时的一些优化查询速度方法(转)

    最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法. 由于在参与的实际项目中发现当mysql表的数据量达到百万级时,普通SQL查询效率呈直线下降,而且如果whe ...

  3. linux学习2--目录结构

    根据FHS(http://www.pathname.com/fhs/)的官方文件指出, 他们的主要目的是希望让使用者可以了解到已安装软件通常放置于那个目录下, 所以他们希望独立的软件开发商.操作系统制 ...

  4. web大文件上传控件-监控f_create流程-Xproer.HttpUploader6

    监控f_create流程 1.打开ie,f12 2.启动网络监控 点击开始捕获 上传文件,然后查看监控 将监控信息转到详细视图 向f_create提交的数据 f_create返回值

  5. HttpUploader2 -chrome 45+安装教程

    HttpUploader2-Chrome 45+安装说明 步骤如下: a.先安装HttpUploader2.exe,HttpUploader2.exe为插件集成安装包. b.再安装HttpUpload ...

  6. Java WEB中的HttpServletResponse数据传递

    1.什么是HttpServletResponse 2.使用HttpServletResponse向浏览器发送数据及相关实例. 实例1:实现文件下载功能 实例2:实现验证码注册 实例3:实现页面3秒后跳 ...

  7. webapi put 请求405问题

    put 请求的时候  浏览器会像服务器发送两个请求 如何没做任何配置第一个options请求是会报错的 这是需要配置路由给options作响应 这时options请求就通过了,然后你们会看到你的put ...

  8. Mybatis中的多表查询 多对一,一对多

    示例:用户和账户 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) 步骤: 1.建立两张表:用户表,账户表 让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中 ...

  9. python字符串常用方法、分割字符串等

    一.字符串的常用方法 1.str.capitalize()  字符串首字母大写 2.str.center()  把字符串居中 3.str.isalnum() 判断字符串是否含有英文.数字,若有英文和数 ...

  10. oracle调试存储过程不进去

    右击存储过程,选中Add debug information即可