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

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. 简单Factory模式

    #pragma once #include "student.h" #include "Teacher.h" typedef enum _EPersonType ...

  2. 使对象可以像数组一样foreach循环,要求属性必须是私有的(写个类实现Iterator接口)

    <?php class Test implements Iterator { ,,,,); public function __construct() { } // 重置,将数组内部指针指向第一 ...

  3. ifcfg-eth0文件参数PREFIX 和 NETMASK的配置不一致问题

    ifcfg-eth0文件参数PREFIX 和 NETMASK的配置不一致问题 摘自:https://blog.csdn.net/aikui0621/article/details/9148997 阅读 ...

  4. 【Azure Active Directory】单一登录 (SAML 协议)

    Azure Active Directory 支持 SAML 2.0 Web 浏览器单一登录 (SSO) 配置文件. 若要请求 Azure Active Directory 对用户进行身份验证时,云服 ...

  5. WC 代码统计 java

    GitHub地址 项目需求 实现一个wc统计程序,可以对文本进行相关功能的统计与分析 基本功能 -c 统计字符数 -w 统计文件词数 -l 统计行数 扩展功能 -s 递归搜索目录下面的文件 -a 返回 ...

  6. JavaScript补充:BOM(浏览器对象模型)

    一些公共对象.详细参考手册. 一.Window 对象 Window 对象表示浏览器中打开的窗口. 如果文档包含框架(<frame> 或 <iframe> 标签),浏览器会为 H ...

  7. arp欺骗进行流量截获-2

    上一篇讲了原理,那么这一篇主要讲如何实现.基本上也就是实现上面的两个步骤,这里基于gopacket实现,我会带着大家一步步详细把每个步骤都讲到. ARP 欺骗 首先就是伪造ARP请求,让A和B把数据包 ...

  8. 快速了解“云原生”(Cloud Native)和前端开发的技术结合点

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 后端视角,结合点就是通过前端流控缓解后端的压力,提升系统响应能力. 从一般意义理解,Cloud Native 是后端应用的事情,要搞的是系统解耦.横 ...

  9. hadoop中常用的hdfs代码操作

    一:向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件: package hadoopTest; import org.apache.h ...

  10. C# winform调用类似按钮点击的事件时自带参数该怎么写

    //按钮事件 private void btn_Click(object sender, EventArgs e) {} //自己的函数 private void myFunc() { //程序中其他 ...