一 購買云立方動態(tài)撥號服務器
1 進入云立方官網后里初,需要先注冊會員再進行購買,因為做爬蟲試用厂庇,所以我選的是單地區(qū)動態(tài)撥號服務器。
2 接下來需要自己手動安裝操作系統(tǒng)(安裝之前需要支付寶實名認證黄刚,跟著具體操作步驟走就好了)
3 安裝好了以后便可以測試撥號了
1 adsl-start 啟動撥號服務
2 adsl-stop 關閉撥號服務
二 安裝配置tinyproxy代理(centos7.1為例)
(一) 安裝tinyproxy
yum install -y epel-release
yum update -y
yum install -y tinyproxy
(二) 配置tinyproxy
安裝完成之后還需要配置一下TinyProxy才可以用作代理服務器,需要編輯配置文件脖捻,它一般的路徑是/etc/tinyproxy/tinyproxy.conf弥搞。
1 Port 8888
在這里可以設置代理的端口,默認是8888抢蚀。
2 #Allow 127.0.0.1
這是被允許連接的主機的IP镀层,如果想任何主機都可以連接,那就直接將它注釋即可皿曲,所以在這里我們選擇直接注釋唱逢,也就是任何主機都可以使用這臺主機作為代理服務器了。
3 systemctl start tinyproxy.service 啟動服務
4 systemctl stop tinyproxy.service 關閉服務
5 curl -x 112.84.118.216:8888 httpbin.org/get
用curl命令設置代理請求一下httpbin屋休,檢測下代理是否生效坞古。
(三)安裝python3
我們安裝得centos7默認是安裝了python2的,而且這個Python2不能被刪除劫樟,因為有很多系統(tǒng)命令痪枫,比如yum都要用到织堂。因此我們需要自己手動安裝python3,步驟如下:
1 首先安裝依賴包
yum -y groupinstall "Development tools"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
2 然后根據(jù)自己需求下載不同版本的Python3奶陈,我下載的是Python3.6.2
wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz
3 建立一個空文件夾易阳,將下載壓縮包Python-3.6.2.tar.xz移至python3文件夾下
mkdir /usr/local/python3
4 然后解壓壓縮包,進入該目錄吃粒,安裝Python3
tar -xvJf Python-3.6.2.tar.xz
cd Python-3.6.2
./configure --prefix=/usr/local/python3
make && make install
5 最后創(chuàng)建軟鏈接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
三 撥號VPS實現(xiàn)
撥號主機主要完成一下三件事:
1 定時執(zhí)行撥號腳本換IP
2 換IP后立即請求遠程主機
3 撥號后檢測是否撥號成功潦俺,如果失敗立即重新?lián)芴?/strong>
定時撥號
撥號VPS需要每隔一段時間就撥號一次,我們可以直接執(zhí)行命令行來撥號徐勃,那在Python里我們只需要調用一下這個撥號命令就好了事示。利用subprocess模塊調用腳本即可,在這里定義一個變量ADSL_BASH為adsl-stop;adsl-start僻肖,這就是撥號的腳本肖爵。
import subprocess
(status, output) = subprocess.getstatusoutput(ADSL_BASH)
通過getstatusoutput方法可以獲取腳本的執(zhí)行狀態(tài)和輸出結果,如果status為0檐涝,則證明撥號成功遏匆,然后檢測一下?lián)芴柦涌谑欠瘾@取了IP地址。
執(zhí)行ifconfig命令可以獲取當前的IP谁榜,我這臺主機接口名稱叫做ppp0幅聘,當然網卡名稱可以自己指定,所以將ppp0接口的IP提取出來即可窃植。
def get_ip(self, ifname=ADSL_IFNAME):
(status, output) = subprocess.getstatusoutput('ifconfig')
if status == 0:
pattern = re.compile(ifname + '.*?inet.*?(\d+\.\d+\.\d+\.\d+).*?netmask', re.S)
result = re.search(pattern, output)
if result:
ip = result.group(1)
return ip
如果方法正常返回IP帝蒿,則證明IP存在,撥號成功巷怜,接下來向遠程主機發(fā)送請求即可葛超,然后sleep一段時間重新再次撥號。
如果方法返回的值為空延塑,那證明IP不存在绣张,我們需要重新?lián)芴枴?/p>
請求遠程主機
發(fā)送的時候需要攜帶這么幾個信息,一個是通信秘鑰关带,一個是代理端口侥涵,另一個是主機的標識符,用requests發(fā)送即可宋雏。
requests.post(SERVER_URL, data={'token': TOKEN, 'port': PROXY_PORT, 'name': CLIENT_NAME})
所以整體的思路實現(xiàn)可以寫成這樣子:
def adsl(self):
while True:
print('ADSL Start, Please wait')
(status, output) = subprocess.getstatusoutput(ADSL_BASH)
if status == 0:
print('ADSL Successfully')
ip = self.get_ip()
if ip:
print('New IP', ip)
try:
requests.post(SERVER_URL, data={'token': TOKEN, 'port': PROXY_PORT, 'name': CLIENT_NAME})
print('Successfully Sent to Server', SERVER_URL)
except ConnectionError:
print('Failed to Connect Server', SERVER_URL)
time.sleep(ADSL_CYCLE)
else:
print('Get IP Failed')
else:
print('ADSL Failed, Please Check')
time.sleep(1)
哈哈芜飘,本項目參考我們的大帥哥崔慶才的博客:靜覓 ? 使用Tornado+Redis維護ADSL撥號服務器代理池
他的github項目地址:ADSLProxyPool
記得順便給我一個小愛心哦O(∩_∩)O