使用proxy_pool来为爬虫程序自动更换代理IP
文章目錄
- 1. 前言
- 2. 教程
- 3. 官網
- 4. 在線demo
- 4.1. 本地部署
- 4.2. 安裝
- 4.2.1. Python源碼構建安裝
- 4.2.1.1. 安裝redis數據庫
- 4.2.1.1.1. 下載redis源碼
- 4.2.1.1.2. 啟動redis服務
- 4.2.1.1.3. 安裝redis服務
- 4.2.1.1.4. 再次通過命令啟動redis服務
- 4.2.1.1.5. 測試redis服務是否可用
- 4.2.1.2. 下載proxy_pool源碼
- 4.2.1.3. 安裝依賴
- 4.2.1.4. 更新配置
- 4.2.1.4.1. 配置參數
- 4.2.1.4.2. 配置參數案例
- 4.2.1.5. 啟動項目
- 4.2.1.6. 測試API的調用
- 4.2.1.6.1. 直接打開網頁版
- 4.2.1.6.2. 代碼測試
- 4.2.2. docker安裝
- 4.2.3. API調用
- 5. 報錯
1. 前言
- 之前做爬蟲的時候,經常會遇到對于一個網頁,使用同一個IP多次會被禁掉IP的問題,我們可以自己手動更換代理IP再繼續這個問題但多少會有點麻煩,我對于一個懶人來說,手動更換IP太麻煩,而且也不符合程序員懶惰的美德,于是便有了下面的故事。
- proxy_pool 是一個開源的代理池,聚合了各大免費的 ip 代理池。當自己的爬蟲因為爬的太快了 ip 被封了的時候,代理池就可以派上用場啦
- 爬蟲代理IP池項目,主要功能為定時采集網上發布的免費代理驗證入庫,定時驗證入庫的代理保證代理的可用性,提供API和CLI兩種使用方式。同時你也可以擴展代理源以增加代理池IP的質量和數量。
2. 教程
- 部署自己的代理池 - idealclover
3. 官網
- GitHub - jhao104/proxy_pool: Python爬蟲代理IP池(proxy pool)
4. 在線demo
- demo.spiderpy.cn/
4.1. 本地部署
4.2. 安裝
- python爬蟲添加代理ip池ProxyPool (Windows) - 灰信網(軟件開發博客聚合)
4.2.1. Python源碼構建安裝
4.2.1.1. 安裝redis數據庫
4.2.1.1.1. 下載redis源碼
- Windows下安裝Redis圖文教程_喵代王-香菜的博客-CSDN博客_windows安裝redis
- windows首先下載安裝Redis安裝包,并解壓到合適位置(放哪都行)
4.2.1.1.2. 啟動redis服務
- cmd進入文件位置
- redis-server.exe redis.windows.conf
4.2.1.1.3. 安裝redis服務
- 再打開一個cmd窗口,輸入下面的命令,將Redis安裝到Windows服務中
- redis-server --service-install redis.windows.conf
- 查看是否添加進去了服務
- services.msc
4.2.1.1.4. 再次通過命令啟動redis服務
- 關閉第一個“啟動服務”cmd窗口,另開一個cmd窗口,啟動服務
- redis-server --service-start
- 關閉服務命令
- redis-server --service-stop
4.2.1.1.5. 測試redis服務是否可用
- redis-cli.exe -h 127.0.0.1 -p 6379
- 如果沒報錯,并且顯示下面的界面的話,就表示這個redis服務現在可用
4.2.1.2. 下載proxy_pool源碼
git clone git@github.com:jhao104/proxy_pool.git- 如果無法通過這種方法克隆的話,就手動下載吧
- 或者直接下載特定的release版本
- Releases · jhao104/proxy_pool · GitHub
4.2.1.3. 安裝依賴
pip install -r requirements.txt4.2.1.4. 更新配置
- 配置文件 setting.py 位于項目的主目錄下:
4.2.1.4.1. 配置參數
- 配置參考 — ProxyPool 2.1.0 文檔
- 配置參數說明
- 服務配置
- HOST
- API服務監聽的IP, 本機訪問設置為 127.0.0.1, 開啟遠程訪問設置為: 0.0.0.0
- PORT
- API服務監聽的端口.
- 數據庫配置
- DB_CONN
- 用戶存放代理IP的數據庫URI, 配置格式為: db_type://[[user]:[pwd]]@ip:port/[db]
- 目前支持的db_type有: ssdb 、 redis.
- DB_CONN配置示例
- TABLE_NAME
- 存放代理的數據載體名稱, ssdb和redis的存放結構為hash.
- 采集配置
- PROXY_FETCHER
- 啟用的代理采集方法名, 代理采集方法位于 fetcher/proxyFetcher.py 類中.
- 由于各個代理源的穩定性不容易掌握, 當某個代理采集方法失效時, 可以該配置中注釋掉其名稱.
- 如果有增加某些代理采集方法, 也請在該配置中添加其方法名, 具體請參考 /dev/extend_fetcher.
- 調度程序每次執行采集任務時都會再次加載該配置, 保證每次運行的采集方法都是有效的.
- 這里需要實時進行更新
- 校驗配置
- HTTP_URL
- 用于檢驗代理是否可用的地址, 默認為 http://httpbin.org ,可根據使用場景修改為其他地址.
- HTTPS_URL
- 用于檢驗代理是否支持HTTPS的地址, 默認為 https://www.qq.com ,可根據使用場景修改為其他地址.
- VERIFY_TIMEOUT
- 檢驗代理的超時時間, 默認為 10 , 單位秒. 使用代理訪問 HTTP(S)_URL 耗時超過 VERIFY_TIMEOUT 時, 視為代理不可用.
- MAX_FAIL_COUNT
- 檢驗代理允許最大失敗次數, 默認為 0, 即出錯一次即刪除.
- POOL_SIZE_MIN
- 代理檢測定時任務運行前若代理數量小于 POOL_SIZE_MIN, 則先運行抓取程序.
4.2.1.4.2. 配置參數案例
# Config.ini 為項目配置文件 # 配置DB type = SSDB # 如果使用SSDB或redis數據庫,均配置為SSDB host = localhost # db host port = 6379 # db port name = proxy # 默認配置 # 配置 ProxyGetter freeProxyFirst = 1 # 這里是啟動的抓取函數,可在ProxyGetter/getFreeProxy.py 擴展 freeProxySecond = 1 .... # 配置 HOST (api服務) ip = 127.0.0.1 # 監聽ip,0.0.0.0開啟外網訪問 port = 5010 # 監聽端口 # 上面配置啟動后,代理api地址為 http://127.0.0.1:5010- 第一個port是你數據庫的端口號, 第二個是api的端口號
- 目標計算機積極拒絕 · Issue #118 · jhao104/proxy_pool · GitHub
4.2.1.5. 啟動項目
- 如果已配置好運行環境, 具備運行條件, 可以通過 proxyPool.py 啟動. proxyPool.py 是項目的CLI入口. 完整程序包含兩部份: schedule 調度程序和 server API服務, 調度程序負責采集和驗證代理, API服務提供代理服務HTTP接口.
- 通過命令行程序分別啟動 調度程序和API服務:
- 啟動調度程序:python proxyPool.py schedule
- 可以看到,正在采集對于IP,有的成功,有的失敗
- 最終穩定下來
- 再開一個命令號,啟動webApi服務:python proxyPool.py server
4.2.1.6. 測試API的調用
4.2.1.6.1. 直接打開網頁版
- 127.0.0.1:5010/get/
- http://127.0.0.1:5010/get/
- 這里需要注意的是,網址端口應該改成自己之前定義的端口
- 每一次刷新上面的代理IP地址都會發生改變
4.2.1.6.2. 代碼測試
import requests def get_proxy(): #5000:settings中設置的監聽端口,不是Redis服務的端口 return requests.get("http://127.0.0.1:5000/get/").json() def delete_proxy(proxy): requests.get("http://127.0.0.1:5000/delete/?proxy={}".format(proxy)) # 主代碼 def getHtml(): retry_count = 5 proxy = get_proxy().get("proxy") print(proxy) while retry_count > 0: try: html = requests.get('http://www.baidu.com', proxies={"http": "http://{}".format(proxy)}) print(html.text) break except Exception: retry_count -= 1 # 刪除代理池中代理 delete_proxy(proxy) return None getHtml()4.2.2. docker安裝
安裝
docker pull jhao104/proxy_pool docker run --env DB_CONN=redis://:password@ip:port/0 -p 5010:5010 jhao104/proxy_pool:latest- 運行
4.2.3. API調用
啟動web服務后, 默認配置下會開啟127.0.0.1:5010/ 的api接口服務:
參數
5. 報錯
-
ValueError: invalid literal for int() with base 10: ‘port’
-
可能是一個端口不可用吧,在GUI界面中修改一下端口號就好了
-
redis.exceptions.ConnectionError: Error 10061 connecting to 127.0.0.1:6379. 由于目標計算機積極拒絕,無法連接。.2022-12-24 20:52:10,677 launcher.py[line:39] INFO exit!
-
可能只是自己參數設置的不對吧
-
redis.exceptions.AuthenticationError: Client sent AUTH, but no password is set 2022-12-24 21:56:48,828 launcher.py[line:39] INFO exit!
-
redis的賬號密碼設置的不對
DB_CONN配置示例 -
ImportError: cannot import name ‘Markup’ from ‘jinja2’ (D:\Program\Anaconda3\lib\site-packages\jinja2_init_.py)
-
python版本太高了,目前支持到3.6. 3.6以上的版本把requirements.txt里面的版本號刪掉 重新pip install 一下
-
pip uninstall -r requirements.txt
-
pip install -r requirements.txt
-
運行出錯! · Issue #663 · jhao104/proxy_pool · GitHub
之后就正常了
-
requests.exceptions.ConnectionError: HTTPConnectionPool(host=‘127.0.0.1’, port=5000): Max retries exceeded with url: /get/ (Caused by NewConnectionError(‘<urllib3.connection.HTTPConnection object at 0x000001AF5F88EAD0 Failed to establish a new connection: [WinError 10061] 由于目標計算機積極拒絕,無法連接。’))
-
很簡單,端口不匹配,更改即可
ctionPool**(host=‘127.0.0.1’, port=5000): Max retries exceeded with url: /get/ (Caused by NewConnectionError(‘<urllib3.connection.HTTPConnection object at 0x000001AF5F88EAD0 Failed to establish a new connection: [WinError 10061] 由于目標計算機積極拒絕,無法連接。’))
- 很簡單,端口不匹配,更改即可
[外鏈圖片轉存中…(img-nAUDtJec-1671896468370)]
總結
以上是生活随笔為你收集整理的使用proxy_pool来为爬虫程序自动更换代理IP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Security 短信验证
- 下一篇: 上岸学长学姐留下的24个考研秘诀