Python爬蟲進階七之設置ADSL撥號服務器代理

那夜

那是一個寂靜的深夜,科比還沒起牀練球,雖然他真的可能不練了。html

我廢了好大勁,爬蟲終於寫好了!BUG也所有調通了!心想,終於能夠不勞而獲了!python

泡杯茶,安靜地坐在椅子上看着屏幕上一行行文字在控制檯跳出,一條條數據嗖嗖進入個人數據庫,一張張圖片悄悄存入個人硬盤。人生沒有幾個比這更愜意的事情了。git

我端起茶杯,抿了一口,靜靜地回味着茶香。github

這時,什麼狀況!屏幕爆紅了!爆紅了!一口茶的功夫啊喂!數據庫

怎麼回事!咋爬不動了,不動了!我用瀏覽器點開那一個個報錯的連接,瀏覽器顯示瀏覽器

您的請求過於頻繁,IP已經被暫時封禁,請稍後再試!bash

沃日,我IP被封了?此時此刻,空氣凝固了,茶也再也不香了,請給我一個愛的抱抱啊。服務器

時候不早了,仍是洗洗睡吧。網絡

第二天

那一晚,展轉反側難以入睡。curl

怎麼辦?怎麼辦?若是是你你該怎麼辦?

手動換個IP?得了吧,一會又要封了,還能不能安心睡覺啊?

找免費代理?可行,不過我以前測過很多免費代理IP,一大半都很差用,並且慢。不過能夠一直維護一個代理池,定時更新。

買代理?能夠能夠,不過優質的代理服務商價格但是不菲的,我買過一些廉價的,好比幾塊錢套餐一次提取幾百IP的,算了仍是不說了都是淚。

然而最行之有效的方法是什麼?那固然是ADSL撥號!

這是個啥?且聽我慢慢道來。

什麼是ADSL

ADSL (Asymmetric Digital Subscriber Line ,非對稱數字用戶環路)是一種新的數據傳輸方式。它由於上行和下行帶寬不對稱,所以稱爲非對稱數字用戶線環路。它採用頻分複用技術把普通的電話線分紅了電話、上行和下行三個相對獨立的信道,從而避免了相互之間的干擾。

他有個獨有的特色,每撥一次號,就獲取一個新的IP。也就是它的IP是不固定的,不過既然是撥號上網嘛,速度也是有保障的,用它搭建一個代理,那既能保證可用,又能自由控制撥號切換。

若是你是用的ADSL上網方式,那就不用過多設置了,直接本身電腦調用一個撥號命令就行了,自動換IP,分分鐘解決封IP的事。

然而,你可能說?我家寬帶啊,我連得公司無線啊,我蹭的網上的啊!那咋辦?

這時,你就須要一臺VPS撥號主機。

購買服務器

某度廣告作的那麼好是吧?一搜一片,這點谷歌但是遠遠比不上啊。

因而乎,我就搜了搜,鍵入:撥號服務器,有什麼騎士互聯啊、無極網絡啊、掛機寶啊等等的。我選了個價錢還湊合的,選了個無極網絡(這裏不是在打廣告),80一個月的配置,一天兩塊錢多點。

2核、512M內存,10M帶寬。

下面是連接:

無極網絡撥號VPS

你們以爲有更便宜的更好用請告訴我呀!

接下來開始裝操做系統,進入後臺,有一個自助裝系統的頁面。

我裝的CentOS的,在後面設置代理啊,定時任務啊,遠程SSH管理啊之類的比較方便。若是你想用Windows,能配置好代理那也沒問題。

有的小夥伴可能會問了,既然它的IP是撥號變化的,你咋用SSH連?其實服務商提供了一個域名,作了動態解析和端口映射,映射到這臺主機的22端口就行了,因此不用擔憂IP變化致使SSH斷開的問題。

好了裝好了服務器以後,服務商提供了一個ADSL的撥號操做過程,用pppoe命令均可以完成,若是你的是Linux的主機通常都是用這個。而後服務商還會給給你一個撥號帳號和密碼。

那麼接下來就是試下撥號了。

服務商會提供詳細的撥號流程說明。

好比無極的是這樣的:

撥號流程

設置好了以後,就有幾個關鍵命令:

1

2

3

pppoe-start 撥號

pppoe-stop  斷開撥號

pppoe-status 撥號鏈接狀態

若是想從新撥號,那就執行stop、start就能夠了。

反覆執行,而後查看下ip地址,你會發現撥號一次換一個IP,是否是爽翻了!

好,那接下來就設置代理吧。

設置代理服務器

以前老是用別人的代理,沒本身設置過吧?那麼接下來咱們就來親自搭建HTTP代理。

Linux下搭建HTTP代理,推薦Squid和TinyProxy。都很是好配置,你想用哪一個都行,且聽我慢慢道來。

個人系統是CentOS,以它爲例進行說明。

Squid

首先利用yum安裝squid

1

yum -y install squid

設置開機啓動

1

chkconfig --level 35 squid on

修改配置文件

1

vi /etc/squid/squid.conf

修改以下幾個部分:

1

2

3

http_access allow !Safe_ports    #deny改爲allow

http_access allow CONNECT !SSL_ports  #deny改爲allow

http_access allow all  #deny改爲allow

其餘的不須要過多配置。

啓動squid

1

sudo service squid start

如此一來配置就完成了。

代理使用的端口是3128

TinyProxy

首先添加一下鏡像源,而後安裝

1

2

3

rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm

yum update

yum install tinyproxy

修改配置

1

vi /etc/tinyproxy/tinyproxy.conf

能夠修改端口和容許的IP,若是想任意主機都鏈接那就把Allow這一行註釋掉。

1

2

3

4

Port 8888 #預設是8888 Port,你能夠更改

Allow 127.0.0.1 #將127.0.0.1改爲你本身的IP

#例如你的IP 是1.2.3.4,你改爲Allow 1.2.3.4,那只有你才能夠連上這個Proxy

#若你想任何IP均可以臉到Proxy在Allow前面打#註釋

啓動TinyProxy

1

service tinyproxy start

 

好了,兩個代理都配置好了。

你想用那個均可以!

不過你覺得這樣就完了嗎?太天真了,我被困擾了好幾天,怎麼都連不上,我還在懷疑是否是我哪裏設置得不對?各類搜,一直覺得是哪裏配置有遺漏,後來發現是iptables的鍋,萬惡的防火牆。踩過的的坑,那就不要讓你們踩了,用下面的命令設置下iptables,放行3128和8888端口就行了。

1

2

3

4

5

6

service iptables save

systemctl stop firewalld

systemctl disable  firewalld

systemctl start iptables

systemctl status iptables

systemctl enable iptables

修改iptables配置

1

vi /etc/sysconfig/iptables

1

-A IN_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

的下面添加兩條規則

1

2

-A IN_public_allow -p tcp -m tcp --dport 3128 -m conntrack --ctstate NEW -j ACCEPT

-A IN_public_allow -p tcp -m tcp --dport 8888 -m conntrack --ctstate NEW -j ACCEPT

如圖所示

保存,而後重啓iptables

1

sudo service iptabels restart

輸入

ifconfig獲得IP地址,在其餘的主機上輸入

1

curl -x IP:8888 www.baidu.com

測試一下,若是能出現結果,那就說明沒問題。

若是怎麼配都連不上,那乾脆關了你的防火牆吧。雖然不推薦。

鏈接代理

接下來纔是重頭戲,你咋知道你的服務器IP如今究竟是多少啊?撥一次號IP就換一次,那這還了得?

若是服務商提供了端口映射!那一切都解決了!直接用端口映射過去就行了。然而,個人並無。

自力更生,艱苦創業!

首先我研究了一下DDNS服務,也就是動態域名解析。即便你的IP在變化,那也能夠經過一個域名來映射過來。

原理簡單而統一:當前撥號主機定時向一個固定的服務器發請求,服務器獲取remote_addr就行了,能夠作到定時更新和解析。

那麼我找了一下,國內作的比較好的就是花生殼了,而後又找到了DNSPOD的接口解析。

下面簡單說下個人折騰過程,你們能夠先不用試,後面有更有效的方法。

花生殼

如今花生殼出到3.0版本了,有免費版和付費版之分,我就試用了一下免費版的。這裏是花生殼的一些配置和下載:

花生殼配置

下載花生殼客戶端以後,會生成SN碼,用這個在花生殼的官網登陸後,會分配給你一個免費的域名。

接下來這個域名就能解析到你的主機了。

DNSPOD

DNSPOD原理也是同樣,不過好處是你能夠配置本身的域名。

在GitHub上有腳本可使用。

腳本連接

具體的細節我就不說了,實際上就是定時請求,利用remote_addr更新DNSPOD記錄,作到動態解析。

解析接口

不過!這兩個有個通病!慢!

什麼慢?解析慢!但這不是他們的鍋,由於DNS修改後徹底生效就是須要必定的時間,這一秒你撥號了,而後更新了IP,可是域名可能仍是解析着原來的IP,須要過幾分鐘才能變過來。這能忍嗎?

我但是在跑爬蟲啊,這還能忍?

自力更生

嗯,V2EX果真是個好地方,逛了一下,收穫不小。

連接在此

參考了 abelyao 的思路,本身寫了腳原本獲取IP,保證秒級更新!

此時,你還須要另外一臺固定IP的主機或者某個雲服務器,只要是地址固定的就好。在這裏我用了另外一臺有固定IP的阿里雲主機,固然你若是有什麼新浪雲啊之類的也能夠。

那麼如今的思路就是,撥號VPS定時撥號換IP,而後請求阿里雲主機,阿里雲主機獲取VPS的IP地址便可。

撥號VPS作的事情:

定時撥號,定時請求服務器。使用bash腳本,而後crontab定時執行。

遠程服務器:

接收請求,獲取remote_addr,保存起來。使用Flask搭建服務器,接收請求。

廢話少說,上代碼

AutoProxy

功能

因爲DDNS生效時間過長,對於爬蟲等一些時間要求比較緊迫的項目就不太適用,爲此本項目根據DDNS基本原理來實現實時獲取ADSL撥號主機IP。

基本原理

client文件夾由ADSL撥號客戶機運行。它會定時執行撥號操做,而後請求某個固定地址的服務器,以便讓服務器獲取ADSL撥號客戶機的IP,主要是定時bash腳本運行。

server文件夾是服務器端運行,利用Python的Flask搭建服務器,而後接收ADSL撥號客戶機的請求,獲得remote_addr,獲取客戶機撥號後的IP。

項目結構

server

  •  config.py 配置文件。
  •  ip 客戶端請求後獲取的客戶端IP,文本保存。
  •  main.py Flask主程序,提供兩個接口,一個是接收客戶端請求,而後將IP保存,另一個是獲取當前保存的IP。

client

  •  crontab 定時任務命令示例。
  •  pppoe.sh 撥號腳本,主要是實現從新撥號的幾個命令。
  •  request.sh 請求服務器的腳本,主要是實現撥號後請求服務器的操做。
  •  reqeust.conf 配置文件。

使用

服務器

服務器提供兩個功能,record方法是客戶機定時請求,而後獲取客戶機IP並保存。proxy方法是供咱們本身用,返回保存的客戶機IP,提取代理。

克隆項目

1

git clone https://github.com/Germey/AutoProxy.gi

修改配置

修改config.py文件

  •  KEY 是客戶端請求服務器時的憑證,在client的reqeust.conf也有相同的配置,兩者保持一致便可。
  •  NEED_AUTH 在獲取當前保存的IP(即代理的IP)的時候,爲防止本身的主機代理被濫用,在獲取IP的時候,須要加權限驗證。
  •  AUTH_USER和AUTH_PASSWORD分別是認證用戶名密碼。
  •  PORT默認端口,返回保存的結果中會自動添加這個端口,組成一個IP:PORT的代理形式。

運行

1

2

cd server

nohup python main.py

ADSL客戶機

克隆項目

1

git clone https://github.com/Germey/AutoProxy.git

修改配置

修改reqeust.conf文件

  • KEY 是客戶端請求服務器時的憑證,在server的config.py也有相同的配置,兩者保持一致便可。
  •  SERVER是服務器項目運行後的地址,通常爲http://<服務器IP>/record。如http://120.27.14.24/record

修改pppoe.sh文件

這裏面寫上從新撥號的幾條命令,記得在前兩行配置一下環境變量,配置上撥號命令所在的目錄,以防出現腳本沒法運行的問題。

運行

設置定時任務

1

crontab -e

輸入crontab的實例命令

1

*/5 * * * * /var/py/AutoProxy/client/request.sh /var/py/AutoProxy/client/request.conf >> /var/py/AutoProxy/client/request.log

注意修改路徑,你的項目在哪裏,都統一修改爲本身項目的路徑。

最前面的*/5是5分鐘執行一次。

好了,保存以後,定時任務就會開啓。

驗證結果

這樣一來,訪問服務器地址,就能夠獲得ADSL撥號客戶機的IP了。

1

2

3

4

5

import requests

 

url = 'http://120.27.14.24:5000'

proxy = requests.get(url, auth=('admin', '123')).text

print(proxy)

實例結果:

1

116.208.97.22:8888

擴展

若是你有域名,能夠本身解析一個域名,這樣就能夠直接請求本身的域名,拿到實時好用的代理了,並且定時更新。

代理設置

urllib2

1

2

3

4

5

6

import urllib2

proxy_handler = urllib2.ProxyHandler({"http": 'http://' + proxy})

opener = urllib2.build_opener(proxy_handler)

urllib2.install_opener(opener)

response = urllib2.urlopen('http://httpbin.org/get')

print response.read()

 

requests

1

2

3

4

5

6

import requests

proxies = {

'http': 'http://' + proxy,

}

r = requests.get('http://httpbin.org/get', proxies=proxies)

print(r.text)

 

以上便秒級解決了動態IP解析,本身實現了一遍DDNS,爽!

那這樣以來,之後就能夠直接請求你的主機獲取一個最新可用的代理IP了,穩定可用,定時變化!

以上即是ADSL撥號服務器配置的全過程,但願對你們有幫助!

相關文章
相關標籤/搜索