專案地址:https://github.com/jhao104/proxy_pool
該專案是基於redis的,所以我們首先需要一個redis,這裡我還是選擇用docker快速啟動一個
docker run -d --name redis -p 6380:6379 redis --requirepass yourpassword
docker run -d --name redis redis --requirepass yourpassword
如果你第一步中選擇了對映,呢麼就可以直接跳到0x03 啟動專案 中直接執行了,如果不是,那麼你就需要知道啟動的範例的內網ip,但是當我們docker exec
進去的時候會發現並沒有相關的ip addr
的環境,懶得安裝了,直接在本機用如下命令
docker inspect redis
這裡的redis是容器的name,在結果中找到如下所示即為容器內網ip(可與本機通訊)
本機可以ping通
直接替換密碼,ip以及響應的埠即可,選擇對映出來的話再開放防火牆策略就可以通過公網ip存取了
docker run -d --env DB_CONN=redis://:[email protected]:6379/0 -p 5010:5010 jhao104/proxy_pool:latest
啟動web服務後, 預設設定下會開啟 http://127.0.0.1:5010 的api介面服務:
api | method | Description | params |
---|---|---|---|
/ | GET | api介紹 | None |
/get | GET | 隨機獲取一個代理 | 可選引數: ?type=https 過濾支援https的代理 |
/pop | GET | 獲取並刪除一個代理 | 可選引數: ?type=https 過濾支援https的代理 |
/all | GET | 獲取所有代理 | 可選引數: ?type=https 過濾支援https的代理 |
/count | GET | 檢視代理數量 | None |
/delete | GET | 刪除代理 | ?proxy=host:ip |
如果要在爬蟲程式碼中使用的話, 可以將此api封裝成函數直接使用,例如:
import requests
def get_proxy():
return requests.get("http://127.0.0.1:5010/get/").json()
def delete_proxy(proxy):
requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))
# your spider code
def getHtml():
# ....
retry_count = 5
proxy = get_proxy().get("proxy")
while retry_count > 0:
try:
html = requests.get('http://www.example.com', proxies={"http": "http://{}".format(proxy)})
# 使用代理存取
return html
except Exception:
retry_count -= 1
# 刪除代理池中代理
delete_proxy(proxy)
return None
剩下具體的可以去github看檔案
後續的話可以使用docker-compose,然後編寫yml檔案等等操作來實現更「自動化」