爬蟲爬取代理IP池及代理IP的驗證

最近項目內容須要引入代理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;
返回實際IP的代碼

    結果然的好遺憾。xici高匿代理幾萬條篩出一條就是不錯的結果了。。

3、維護IP池

  開啓服務不斷爬取篩選,篩選出的IP,須要保存到IP池中。IP池經過消息中間件維護,其餘job去訪問便可。

  如何保證從IP池獲取到的IP是實時有效且匿名的呢。

  能夠採起惰性驗證的手段,仍是經過訪問服務測試。 (這裏應該能夠優化一下。給IP打上時間戳,必定時間內能夠不用再次驗證)

相關文章
相關標籤/搜索