網絡爬蟲之IP封禁解決以及搭建代理IP池


引言:之前就提到過常見的反爬蟲機制就有IP封禁,就是當你訪問頻率超過一個閥值服務器就會拒絕服務。這時網頁就會提示“您的IP訪問頻率太高”,或者跳出一個驗證碼讓我們輸入,之后才能解封,但是一會后又會出現這種情況。這時我們就可以通過代理IP來進行請求就可以完美解決這個問題。但是通常各大網站上提供的代理IP可用率都不高,我們就需要搭建自己的IP池來反復篩選剔除不可用的IP。除了這種搭建IP池的方式也還有付費代理或者ADSL混淆撥號。但是成本太高這里就介紹第一種方式。

 

首先先介紹一下代理設置的方法:

測試網站是:http://httpbin.org/get,我們可以根據他返回的origin字段判斷代理是否設置成功。在此之前你需要在代理IP網站上找一個可用的代理IP用來測試。

import requests

proxy = ‘198.50.163.192'
proxies = {
    'http':'http://'+ip,
    'https':'https://'+ip
}
url = 'http://www.httpbin.org/get'

try:
    response = requests.get(url=url,proxies=proxies)
    print(response.text)
except requests.exceptions.ConnectionError as e:
    print('Error',e.args)

結果如下:

{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Cache-Control": "max-age=259200", 
    "Host": "www.httpbin.org", 
    "User-Agent": "python-requests/2.25.1", 
    "X-Amzn-Trace-Id": "Root=1-607afb83-4447c22c3cf70d892063860f"
  }, 
  "origin": "198.50.163.192", 
  "url": "http://www.httpbin.org/get"
}

可見origin字端對應的值就是剛剛我們設置的IP,但是這樣手動設置明顯是不好的,如果我們能動態獲取IP就完美了。

 

這里我動態實現了一個IP池用來獲取各大代理IP網站上的免費代理IP並對其自動進行測試篩選。

准備工作:確保成功安裝Redis數據庫並啟動服務,另外還需要安裝aiohttp,redis-py,pyquery,Flask庫

這里提供一個超好用的開源IP代理池ProxyPool

ProxyPool下載地址:

https://github.com/Python3WebSpider/ProxyPool.git

 

1.ProxyPool的使用:

 

首先使用 git clone 將源代碼拉到你本地,

 

 

 

 

2.進入proxypool目錄,修改settings.py文件,PASSWORD為Redis密碼,如果為空,則設置為None。(新裝的redis一般沒有密碼。),如果不是運行在LInux系統上就需要設置REDIS_HOST也就是你的主機IP地址。端口好默認為6379。

3.開啟redis服務,並關閉防火牆(如果直接運行到本地可以無視)

4.直接運行run.py 不能退出,一直讓它運行!!!

 

 

5.瀏覽器輸入http://0.0.0.0:5555/random即可隨機獲取一個可用的代理IP 或者(http://localhost:5555/random)

 

 

下面我們用代理IP池進行測試:

import requests

PRO_POOL_URL = 'http://localhost:5555/random'
url = 'http://httpbin.org/get'

def get_proxy(): #定義一個獲取代理IP的函數
    try:
        response = requests.get(url=PRO_POOL_URL)
        if response.status_code == 200:
            return response.text
    except ConnectionError:
        return None
proxy = get_proxy()
print(proxy) #輸出一下所獲得的代理IP
proxies_http = {
   'http':'http://'+proxy,
}
proxies_https={
   'https':'https://'+proxy,
}

if url.split(':')[0] == 'http':
    response = requests.get(url=url,proxies=proxies_http).text
    print(response)
else:
    response = requests.get(url=url,proxies=proxies_https).text
    print(response)

 

結果如下:

144.217.101.245:3129
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Cache-Control": "max-age=259200", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.25.1", 
    "X-Amzn-Trace-Id": "Root=1-607b0182-5da37f946cf8ee9021f389ee"
  }, 
  "origin": "144.217.101.245", ###
  "url": "http://httpbin.org/get"
}

 

origin字端返回的是從http://localhost:5555/random隨機獲取的IP證明偽裝IP成功了,這時再對網站進行高頻爬取就不會被封IP了。IP封禁就解決了。但是如果需要更高效的爬取還是用付費代理或者ADSL撥號吧,花錢的畢竟更穩定更快。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM