Python利用动态拨号VPS构建无限稳定ip池(Linux+Windows)

声明

感谢Germey
推荐书籍
推荐视频

解决背景

爬虫,会被封禁IP,或者提示输入验证码
主要角色有三种

  1. 爬虫服务器(CrawlerServer)
  2. Web服务器(WebServer) 可以是私有云或者公有云有固定IP即可
  3. 拨号VPS(目前单机)

架构图

image.png

固定IP服务器

我购买的是阿里云

步骤一 购买拨号VPS主机

可以搜索拨号主机,会有很多厂家。下面非广告举个例子。
云立方 记得先往账户的钱包里存钱,再买,否则购买的时候会提示余额不足。
VPS选择一般配置即可,默认即可。带宽有一定需求。如果做爬虫可以用这台服务器仅仅做个代理即可,所以CPU,内存,硬盘都无需太强。它这里也可以按天和按周购买。

image.png

步骤二 装载CentOS7.1系统

进入管理后台,可以预装载系统,大约需要5-10分钟等待,然后SSH登录即可。
目前他们服务为开机自动拨号,我们可以通过ping来查看网络是否连接

[root@localhost ~]# ping -c3 www.baidu.com
PING www.a.shifen.com (180.97.33.108) 56(84) bytes of data.
64 bytes from 180.97.33.108: icmp_seq=1 ttl=57 time=42.2 ms
64 bytes from 180.97.33.108: icmp_seq=3 ttl=57 time=41.1 ms

--- www.a.shifen.com ping statistics ---
3 packets transmitted, 2 received, 33% packet loss, time 2025ms
rtt min/avg/max/mdev = 41.165/41.721/42.277/0.556 ms

接下来我们看下当前的公网ip是多少,并记下来,来证明断开连接再次拨号换了IP
然后执行断开链接,拨号,再次查看公网ip

[root@localhost ~]# curl icanhazip.com
114.228.155.28
[root@localhost ~]# adsl-stop
[root@localhost ~]# ping -c3 www.baidu.com
ping: unknown host www.baidu.com
[root@localhost ~]# adsl-start
[root@localhost ~]# ping -c3 www.baidu.com
PING www.a.shifen.com (180.97.33.108) 56(84) bytes of data.
64 bytes from 180.97.33.108: icmp_seq=1 ttl=56 time=40.9 ms
64 bytes from 180.97.33.108: icmp_seq=2 ttl=56 time=38.4 ms
64 bytes from 180.97.33.108: icmp_seq=3 ttl=56 time=36.4 ms

--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 36.400/38.610/40.958/1.863 ms
[root@localhost ~]# curl icanhazip.com
114.228.155.97
[root@65 ~]# adsl-stop
[root@65 ~]# adsl-start
[root@65 ~]# curl icanhazip.com
222.188.250.44

我们注意看之前的ip为 114.228.155.28 执行断开,再次ping无法连接网络。之后等待(断开需要一定时间,最好等待大于5秒时间) 一会儿,再次执行拨号adsl-start 成功后,执行ping,发现成功,此时再查看当前的ip 发现已经改变成 114.228.155.97 再次重复以上步骤最终公网ip又被我切成了222.188.250.44 ,可见我们拿到了可用的公网IP

扩展vps

重要的几步

1.购买PPPOE-VPS  装载Centos
2.装载Pyenv 并下载 python 3.6.5 并切换到该环境
3.安装tinyProxy
4.安装client工程使用的requests库
5.拷贝client工程,并且改唯一标识

问题

一是怎样将主机设置为代理服务器
二是怎样实时获取拨号主机的IP

问题一解决 - 搭建HTTP代理服务器

CentOS通过yum来安装tinyproxy
首先安装EPEL源,之后更新yum,安装tinyproxy(第二步可以省略)

yum install -y epel-release
yum update -y
yum install -y tinyproxy

接下来配置

[root@2 ~]# vim /etc/tinyproxy/tinyproxy.conf

修改 Port 端口,默认为 8888
Port 8888
注释掉 Allow 127.0.0.1,表示允许所有人访问代理
启动服务,并且输出当前ip,然后用curl -x测试
curl -x 选项可以为CURL添加代理功能
如:
curl -x proxy:prort icanhazip

# curl -x '39.105.69.135:8888' -v icanhazip.com
* About to connect() to proxy 39.105.69.135 port 8888 (#0)
*   Trying 39.105.69.135...
* Connected to 39.105.69.135 (39.105.69.135) port 8888 (#0)
> GET HTTP://icanhazip.com/ HTTP/1.1
> User-Agent: curl/7.29.0
> Host: icanhazip.com
> Accept: */*
> Proxy-Connection: Keep-Alive
> 
< HTTP/1.1 200 OK
< Via: 1.1 tinyproxy (tinyproxy/1.8.3)
< Content-Type: text/plain; charset=UTF-8
< Server: nginx
< Access-Control-Allow-Methods: GET
< Date: Thu, 26 Jul 2018 07:59:22 GMT
< X-SECURITY: This site DOES NOT distribute malware. Get the facts. https://goo.gl/1FhVpg
< Access-Control-Allow-Origin: *
< Content-Length: 14
< X-RTFM: Learn about this site at http://bit.ly/icanhazip-faq and do not abuse the service.
< 
39.105.69.135
* Connection #0 to host 39.105.69.135 left intact
[root@2 ~]# service tinyproxy start  
Redirecting to /bin/systemctl start tinyproxy.service
[root@2 ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.71.82  netmask 255.255.255.0  broadcast 192.168.71.255
        inet6 fe80::215:5dff:fe0a:d4ee  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:0a:d4:ee  txqueuelen 1000  (Ethernet)
        RX packets 443659  bytes 35678159 (34.0 MiB)
        RX errors 0  dropped 4067  overruns 0  frame 0
        TX packets 9067  bytes 2216916 (2.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::215:5dff:fe0a:d4ef  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:0a:d4:ef  txqueuelen 1000  (Ethernet)
        RX packets 757932  bytes 472570647 (450.6 MiB)
        RX errors 0  dropped 581  overruns 0  frame 0
        TX packets 134427  bytes 9444821 (9.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1492
        inet 117.63.127.2  netmask 255.255.255.255  destination 117.63.127.1
        ppp  txqueuelen 3  (Point-to-Point Protocol)
        RX packets 5785  bytes 7651850 (7.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2850  bytes 142893 (139.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@2 ~]# curl -x 117.63.127.2:8888 httpbin.org/get
{"args":{},"headers":{"Accept":"*/*","Connection":"close","Host":"httpbin.org","User-Agent":"curl/7.29.0"},"origin":"117.63.127.2","url":"http://httpbin.org/get"}

可以看到输出的origin是当前的ip 117.63.127.2 测试成功。

安装pyenv

sudo yum -y install readline readline-devel readline-static
sudo yum -y install openssl openssl-devel openssl-static
sudo yum -y install sqlite-devel
sudo yum -y install bzip2-devel bzip2-libs
cd ~
git clone git://github.com/yyuu/pyenv.git .pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
exec $SHELL -l
pyenv install 3.6.5
pyenv rehash
pyenv global 3.6.5 
pyenv versions 

!如果你无法通过pyenv下载python提示类似下面错误

[root@localhost ~]# pyenv install 3.6.5
Downloading Python-3.6.5.tar.xz...
-> https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz
error: failed to download Python-3.6.5.tar.xz

BUILD FAILED (CentOS Linux 7 using python-build 1.2.4-7-gcbf3983)

这个错误说来惭愧,我搞了很久不知道问题出在哪儿,后来下载python源码编译安装解决了这个问题。
当然现在有更简单的办法,因为我找到错误原因了。
通过使用curl

curl https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz
curl: (35) SSL connect error

所以是SSL错误,这样去解决就简单多了,如下更新网络安全服务,然后就可以再次下载pyenv install 3.6.5

yum update nss

如果还有问题,建议手工安装

Pyenv的手工安装

  1. pyenv搜狐镜像源加速:http://mirrors.sohu.com/python/](http://mirrors.sohu.com/python/
  2. 下载需要的版本放到~/.pyenv/cache文件夹下面
  3. 然后执行 pyenv install 版本号 安装对应的python版本

前提要,安装依赖

yum install -y gcc make patch gdbm-devel openssl-devel sqlite-devel zlib-devel bzip2-devel readline-devel

在.pyenv文件夹下创建cache文件夹,拷贝如 Python-3.6.5.tar.xz到里面。执行

pyenv install 3.6.5

静静等待安装即可
之后键入命令

pyenv rehash
pyenv global 3.6.5
pyenv versions

此时就切到当前3.6.5环境了,非常之爽。

项目Client

需要安装requests库

pip install requests

启动项目

python client.py

该项目会保存日志文件到项目根目录下client_log.txt
接下来Client工程下配置config.py 配置一下WebServer的地址如http://47.52.41.206:20163
配置一下当前代理客户端的唯一标示方便以后做Log排查跟踪问题。
那么至此我们解决了问题一

WindowsServer 拨号主机

上面是基于Linux的VPS来做的,如果是Windows服务器呢?
核心要解决的问题是Windows下宽带的,拨号和断开命令,其实很简单了。

image.png

使用rasdial.exe 打开CMD
断开

rasdial [connectionname] /disconnect 

链接

问题二 - 解决实时获取拨号主机的IP

Redis

我们需要使用到Redis

yum -y install redis

配置文件不用修改,不设密码,用户名localhost ,默认端口6379
最好设置一下Redis开机启动,虽然服务器一般不会重启。
启动service

service redis start

安装tornado

pip install tornado

安装pycurl

相对复杂一些,我安装此库遇到了一些困难。
我使用的是Pyenv的3.6.5 接下来看如何正确安装
第一步安装curl
下载 http://curl.haxx.se/download/curl-7.21.3.tar.gz
解压,进入该文件夹,配置编译安装

tar xzf curl-7.21.3.tar.gz
cd curl-7.21.3
./configure
make
make install

第二步安装pycurl
下载 http://pycurl.sourceforge.net/download/pycurl-7.21.5.tar.gz
需要给pycurl指定curl-config 路径,如下所示:

tar xzf pycurl-7.21.5.tar.gz
cd pycurl-7.21.5
python setup.py install --curl-config=/usr/local/bin/curl-config

此时如果你直接运行项目会报错

libcurl.so.4: cannot open shared object file: No such file or directory

还需如下操作

vim /etc/ld.so.conf
添加
/usr/local/curl/lib/

保存后再执行

sudo ldconfig

接下来Server工程下配置config.py,按照自己的情况配置。默认全部不用改。
OK,大功告成。

运行

工程是Python3版本写的,目前不兼容2.7版本。
我们不希望当Shell关闭时进程被默认挂起,所以使用到了nohup命令参数(也可以用screen、tmux 、supervisor)简单说,我们需要将前台任务变成后台任务变成守护进程
Linux守护进程的启动方法1
Linux守护进程的启动方法2
启动WebServer

nohup python server.py &
ps aux | fgrep server.py
root     22837  0.2  2.2 242332 22404 pts/0    S    13:59   0:00 python server.py

可以看到进程在后台运行了

启动VPS1

nohup python client.py &
ps aux | fgrep client.py
root     42260  4.5  3.5 208808 17672 pts/0    S    02:00   0:00 python client.py

可以看到进程在后台运行了

实时日志看输出

[root@localhost ADSLProxyPool]# tail -f 2018-06-12_client_log.txt
SUCCESS 2018-06-12 02:00:01     117.63.116.81:8888      adsl1
SUCCESS 2018-06-12 02:01:07     117.63.116.150:8888     adsl1
SUCCESS 2018-06-12 02:02:09     117.63.116.213:8888     adsl1
SUCCESS 2018-06-12 02:03:10     117.63.116.178:8888     adsl1

访问


image.png

OK,大功告成

强烈建议使用Pyenv来配置python的开发环境

安装依赖

sudo yum install readline readline-devel readline-static
sudo yum install openssl openssl-devel openssl-static
sudo yum install sqlite-devel
sudo yum install bzip2-devel bzip2-libs

继续

git clone git://github.com/yyuu/pyenv.git .pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
exec $SHELL -l

测试

pyenv --version

安装python,比如3.6.5

pyenv install 3.6.0 (安装版本)
pyenv rehash (刷新)
pyenv global 3.6.0 (切换版本)
pyenv versions (查看已安装的版本,带*为当前使用的版本)

但是国内因为被墙,很有可能你无法下载。等待一会儿,就报错。
我们可以先在国内镜像

http://mirrors.sohu.com/python/

找到对应版本 Python-3.6.5.tar.xz下载后放置到 .pyenv/cache 文件夹下,如果没有就新建一个cache、
之后执行命令

pyenv install 3.6.5

就直接从缓存中拿了,很简单的安装方式。

集群搭建

我们要搭建集群,是因为想实现监控,报警服务。我们研究和利用docker+k8s

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,849评论 6 13
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,813评论 0 5
  • 我以前一直不知道,写作长篇的作家是什么样子的。 我以为他们,或年轻潇洒,或而立成熟,自有自己的一盏明灯,有一方安静...
    一只奶牛阅读 694评论 0 5
  • 如果我这次四级裸考能过就追他 如果下个月太原会有流星雨就追他 如果浙江明天下大雪我就追他 当我把追他寄托在这些事情...
    我佛宠我阅读 131评论 0 1