那是一個寂靜的深夜,科比還沒起牀練球,雖然他真的可能不練了。html
我廢了好大勁,爬蟲終於寫好了!BUG也所有調通了!心想,終於能夠不勞而獲了!python
泡杯茶,安靜地坐在椅子上看着屏幕上一行行文字在控制檯跳出,一條條數據嗖嗖進入個人數據庫,一張張圖片悄悄存入個人硬盤。人生沒有幾個比這更愜意的事情了。git
我端起茶杯,抿了一口,靜靜地回味着茶香。github
這時,什麼狀況!屏幕爆紅了!爆紅了!一口茶的功夫啊喂!數據庫
怎麼回事!咋爬不動了,不動了!我用瀏覽器點開那一個個報錯的連接,瀏覽器顯示瀏覽器
您的請求過於頻繁,IP已經被暫時封禁,請稍後再試!bash
沃日,我IP被封了?此時此刻,空氣凝固了,茶也再也不香了,請給我一個愛的抱抱啊。服務器
時候不早了,仍是洗洗睡吧。網絡
那一晚,展轉反側難以入睡。curl
怎麼辦?怎麼辦?若是是你你該怎麼辦?
手動換個IP?得了吧,一會又要封了,還能不能安心睡覺啊?
找免費代理?可行,不過我以前測過很多免費代理IP,一大半都很差用,並且慢。不過能夠一直維護一個代理池,定時更新。
買代理?能夠能夠,不過優質的代理服務商價格但是不菲的,我買過一些廉價的,好比幾塊錢套餐一次提取幾百IP的,算了仍是不說了都是淚。
然而最行之有效的方法是什麼?那固然是ADSL撥號!
這是個啥?且聽我慢慢道來。
ADSL (Asymmetric Digital Subscriber Line ,非對稱數字用戶環路)是一種新的數據傳輸方式。它由於上行和下行帶寬不對稱,所以稱爲非對稱數字用戶線環路。它採用頻分複用技術把普通的電話線分紅了電話、上行和下行三個相對獨立的信道,從而避免了相互之間的干擾。
他有個獨有的特色,每撥一次號,就獲取一個新的IP。也就是它的IP是不固定的,不過既然是撥號上網嘛,速度也是有保障的,用它搭建一個代理,那既能保證可用,又能自由控制撥號切換。
若是你是用的ADSL上網方式,那就不用過多設置了,直接本身電腦調用一個撥號命令就行了,自動換IP,分分鐘解決封IP的事。
然而,你可能說?我家寬帶啊,我連得公司無線啊,我蹭的網上的啊!那咋辦?
這時,你就須要一臺VPS撥號主機。
某度廣告作的那麼好是吧?一搜一片,這點谷歌但是遠遠比不上啊。
因而乎,我就搜了搜,鍵入:撥號服務器,有什麼騎士互聯啊、無極網絡啊、掛機寶啊等等的。我選了個價錢還湊合的,選了個無極網絡(這裏不是在打廣告),80一個月的配置,一天兩塊錢多點。
2核、512M內存,10M帶寬。
下面是連接:
你們以爲有更便宜的更好用請告訴我呀!
接下來開始裝操做系統,進入後臺,有一個自助裝系統的頁面。
我裝的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,以它爲例進行說明。
首先利用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
首先添加一下鏡像源,而後安裝
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原理也是同樣,不過好處是你能夠配置本身的域名。
在GitHub上有腳本可使用。
具體的細節我就不說了,實際上就是定時請求,利用remote_addr更新DNSPOD記錄,作到動態解析。
不過!這兩個有個通病!慢!
什麼慢?解析慢!但這不是他們的鍋,由於DNS修改後徹底生效就是須要必定的時間,這一秒你撥號了,而後更新了IP,可是域名可能仍是解析着原來的IP,須要過幾分鐘才能變過來。這能忍嗎?
我但是在跑爬蟲啊,這還能忍?
嗯,V2EX果真是個好地方,逛了一下,收穫不小。
參考了 abelyao 的思路,本身寫了腳原本獲取IP,保證秒級更新!
此時,你還須要另外一臺固定IP的主機或者某個雲服務器,只要是地址固定的就好。在這裏我用了另外一臺有固定IP的阿里雲主機,固然你若是有什麼新浪雲啊之類的也能夠。
那麼如今的思路就是,撥號VPS定時撥號換IP,而後請求阿里雲主機,阿里雲主機獲取VPS的IP地址便可。
撥號VPS作的事情:
定時撥號,定時請求服務器。使用bash腳本,而後crontab定時執行。
遠程服務器:
接收請求,獲取remote_addr,保存起來。使用Flask搭建服務器,接收請求。
廢話少說,上代碼
因爲DDNS生效時間過長,對於爬蟲等一些時間要求比較緊迫的項目就不太適用,爲此本項目根據DDNS基本原理來實現實時獲取ADSL撥號主機IP。
client文件夾由ADSL撥號客戶機運行。它會定時執行撥號操做,而後請求某個固定地址的服務器,以便讓服務器獲取ADSL撥號客戶機的IP,主要是定時bash腳本運行。
server文件夾是服務器端運行,利用Python的Flask搭建服務器,而後接收ADSL撥號客戶機的請求,獲得remote_addr,獲取客戶機撥號後的IP。
服務器提供兩個功能,record方法是客戶機定時請求,而後獲取客戶機IP並保存。proxy方法是供咱們本身用,返回保存的客戶機IP,提取代理。
克隆項目
1 |
git clone https://github.com/Germey/AutoProxy.gi |
修改配置
修改config.py文件
1 2 |
cd server nohup python main.py |
ADSL客戶機
克隆項目
1 |
git clone https://github.com/Germey/AutoProxy.git |
修改配置
修改reqeust.conf文件
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 |
若是你有域名,能夠本身解析一個域名,這樣就能夠直接請求本身的域名,拿到實時好用的代理了,並且定時更新。
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() |
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撥號服務器配置的全過程,但願對你們有幫助!