Python利用動態(tài)撥號VPS構建無限穩(wěn)定ip池(Linux+Windows)

聲明

感謝Germey
推薦書籍
推薦視頻

解決背景

爬蟲婶肩,會被封禁IP凭疮,或者提示輸入驗證碼
主要角色有三種

1.爬蟲服務器(CrawlerServer)
2.Web服務器(WebServer) 可以是私有云或者公有云有固定IP即可
3.撥號VPS(目前單機)

架構圖

固定IP服務器

我購買的是老兵數(shù)據(jù)中心

步驟一 購買撥號VPS主機

可以搜索撥號主機静陈,會有很多廠家宜猜。下面非廣告舉個例子吃嘿。
老兵數(shù)據(jù)中心 記得先往賬戶的錢包里存錢最仑,再買,否則購買的時候會提示余額不足赏壹。
VPS選擇一般配置即可鱼炒,默認即可。帶寬有一定需求蝌借。如果做爬蟲可以用這臺服務器僅僅做個代理即可昔瞧,所以CPU,內(nèi)存菩佑,硬盤都無需太強自晰。它這里也可以按天和按周購買。

步驟二 裝載CentOS7.2系統(tǒng)

進入管理后臺稍坯,可以預裝載系統(tǒng)酬荞,大約需要5-10分鐘等待,然后SSH登錄即可瞧哟。
目前他們服務為開機自動撥號混巧,我們可以通過ping來查看網(wǎng)絡是否連接

[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

3 packets transmitted, 2 received, 33% packet loss, time 2025ms
rtt min/avg/max/mdev = 41.165/41.721/42.277/0.556 ms

接下來我們看下當前的公網(wǎng)ip是多少,并記下來勤揩,來證明斷開連接再次撥號換了IP
然后執(zhí)行斷開鏈接咧党,撥號,再次查看公網(wǎng)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

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 執(zhí)行斷開雄可,再次ping無法連接網(wǎng)絡凿傅。之后等待(斷開需要一定時間,最好等待大于5秒時間) 一會兒数苫,再次執(zhí)行撥號adsl-start 成功后聪舒,執(zhí)行ping,發(fā)現(xiàn)成功虐急,此時再查看當前的ip 發(fā)現(xiàn)已經(jīng)改變成 114.228.155.97 再次重復以上步驟最終公網(wǎng)ip又被我切成了222.188.250.44 箱残,可見我們拿到了可用的公網(wǎng)IP

擴展vps

重要的幾步

1.購買PPPOE-VPS 裝載Centos
2.裝載Pyenv 并下載 python 3.6.5 并切換到該環(huán)境
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源碼編譯安裝解決了這個問題奏路。
當然現(xiàn)在有更簡單的辦法,因為我找到錯誤原因了臊诊。
通過使用curl

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

所以是SSL錯誤鸽粉,這樣去解決就簡單多了,如下更新網(wǎng)絡安全服務抓艳,然后就可以再次下載pyenv install 3.6.5了

yum update nss

如果還有問題触机,建議手工安裝

Pyenv的手工安裝

  1. pyenv搜狐鏡像源加速:[http://mirrors.sohu.com/python/](http://mirrors.sohu.com/python/](http://mirrors.sohu.com/python/%5D(http://mirrors.sohu.com/python/)
  2. 下載需要的版本放到~/.pyenv/cache文件夾下面
  3. 然后執(zhí)行 pyenv install 版本號 安裝對應的python版本
yum install -y gcc make patch gdbm-devel openssl-devel sqlite-devel zlib-devel bzip2-devel readline-devel

在.pyenv文件夾下創(chuàng)建cache文件夾,拷貝如 Python-3.6.5.tar.xz到里面玷或。執(zhí)行

pyenv install 3.6.5

靜靜等待安裝即可
之后鍵入命令

pyenv rehash
pyenv global 3.6.5
pyenv versions

此時就切到當前3.6.5環(huán)境了儡首,非常之爽。

項目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下寬帶的约谈,撥號和斷開命令,其實很簡單了犁钟。



使用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/

保存后再執(zhí)行

sudo ldconfig

接下來Server工程下配置config.py,按照自己的情況配置育苟。默認全部不用改较鼓。
OK,大功告成。

運行

工程是Python3版本寫的博烂,目前不兼容2.7版本香椎。
我們不希望當Shell關閉時進程被默認掛起,所以使用到了nohup命令參數(shù)(也可以用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

可以看到進程在后臺運行了

實時日志看輸出

[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

訪問



OK躺率,大功告成

強烈建議使用Pyenv來配置python的開發(fā)環(huán)境

安裝依賴

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

繼續(xù)

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 (查看已安裝的版本,帶*為當前使用的版本)

但是國內(nèi)因為被墻肥照,很有可能你無法下載脚仔。等待一會兒,就報錯舆绎。
我們可以先在國內(nèi)鏡像

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

找到對應版本 Python-3.6.5.tar.xz下載后放置到 .pyenv/cache 文件夾下鲤脏,如果沒有就新建一個cache、
之后執(zhí)行命令

pyenv install 3.6.5

集群搭建

我們要搭建集群吕朵,是因為想實現(xiàn)監(jiān)控猎醇,報警服務。我們研究和利用docker+k8s

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末努溃,一起剝皮案震驚了整個濱河市硫嘶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梧税,老刑警劉巖沦疾,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異第队,居然都是意外死亡哮塞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門凳谦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忆畅,“玉大人馏予,你說我怎么就攤上這事瞧省。” “怎么了署鸡?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵如失,是天一觀的道長绊诲。 經(jīng)常有香客問我,道長岖常,這世上最難降的妖魔是什么驯镊? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上板惑,老公的妹妹穿的比我還像新娘橄镜。我一直安慰自己,他們只是感情好冯乘,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布洽胶。 她就那樣靜靜地躺著,像睡著了一般裆馒。 火紅的嫁衣襯著肌膚如雪姊氓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天喷好,我揣著相機與錄音翔横,去河邊找鬼。 笑死梗搅,一個胖子當著我的面吹牛禾唁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播无切,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼荡短,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哆键?” 一聲冷哼從身側(cè)響起掘托,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎籍嘹,沒想到半個月后闪盔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡噩峦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年锭沟,在試婚紗的時候發(fā)現(xiàn)自己被綠了抽兆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片识补。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辫红,靈堂內(nèi)的尸體忽然破棺而出凭涂,到底是詐尸還是另有隱情,我是刑警寧澤贴妻,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布切油,位于F島的核電站,受9級特大地震影響名惩,放射性物質(zhì)發(fā)生泄漏澎胡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攻谁。 院中可真熱鬧稚伍,春花似錦、人聲如沸戚宦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽受楼。三九已至垦搬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艳汽,已是汗流浹背猴贰。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留河狐,地道東北人糟趾。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像甚牲,于是被迫代替她去往敵國和親义郑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容