引言:之前就提到過常見的反爬蟲機制就有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撥號吧,花錢的畢竟更穩定更快。
