最近項目內容須要引入代理IP去爬取內容。web
爲了項目持續運行,須要不斷構造、維護、驗證代理IP。服務器
爲了繞過服務端對IP 和 頻率的限制,爲了阻止服務端獲取真正的主機IP。tcp
1、服務器如何獲取客戶端IPide
1.js獲取本地IP後提交測試
這種方案能夠經過抓包查看交互,僞造包達到目的。本機就能夠完成。優化
2.服務端經過 http字段獲取真實IP地址網站
能夠經過僞造字段來獲取(能夠本身僞造,也能夠經過高匿代理服務器僞造)spa
3.服務端經過tcp鏈接來肯定真實IP地址代理
這個不可能僞造,否則沒法創建TCP鏈接。code
綜合狀況,咱們最好經過代理IP服務器(匿名 混淆 高匿 三種代理均可以),交由代理處理字段,讓服務端沒法得知本身的IP。
2、爬取免費代理(有錢本身買也行)
1.尋找代理網站而後爬取內容
這邊找的是xici,而後爬取以後對代理進行了篩選。
xici代理會對ua封IP,須要僞造ua逃避掉。
2.驗證並篩選代理IP
有些代理服務器並非高匿,雖然聲稱了高匿,還有廣告陷阱。。。
咱們能夠本身搭建一個web服務測試,看代理服務器是否隱藏咱們的IP,也能夠經過肯定返回內容長度來肯定是不是廣告陷阱。
1 if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { 2 $ip = getenv('HTTP_CLIENT_IP'); 3 } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { 4 $ip = getenv('HTTP_X_FORWARDED_FOR'); 5 } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { 6 $ip = getenv('REMOTE_ADDR'); 7 } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { 8 $ip = $_SERVER['REMOTE_ADDR']; 9 } 10 $res = preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : ''; 11 echo $res;
結果然的好遺憾。xici高匿代理幾萬條篩出一條就是不錯的結果了。。
3、維護IP池
開啓服務不斷爬取篩選,篩選出的IP,須要保存到IP池中。IP池經過消息中間件維護,其餘job去訪問便可。
如何保證從IP池獲取到的IP是實時有效且匿名的呢。
能夠採起惰性驗證的手段,仍是經過訪問服務測試。 (這裏應該能夠優化一下。給IP打上時間戳,必定時間內能夠不用再次驗證)