使用proxy_pool来为爬虫程序自动更换代理IP
文章目錄
- 1. 前言
- 2. 教程
- 3. 官網(wǎng)
- 4. 在線demo
- 4.1. 本地部署
- 4.2. 安裝
- 4.2.1. Python源碼構(gòu)建安裝
- 4.2.1.1. 安裝redis數(shù)據(jù)庫(kù)
- 4.2.1.1.1. 下載redis源碼
- 4.2.1.1.2. 啟動(dòng)redis服務(wù)
- 4.2.1.1.3. 安裝redis服務(wù)
- 4.2.1.1.4. 再次通過(guò)命令啟動(dòng)redis服務(wù)
- 4.2.1.1.5. 測(cè)試redis服務(wù)是否可用
- 4.2.1.2. 下載proxy_pool源碼
- 4.2.1.3. 安裝依賴
- 4.2.1.4. 更新配置
- 4.2.1.4.1. 配置參數(shù)
- 4.2.1.4.2. 配置參數(shù)案例
- 4.2.1.5. 啟動(dòng)項(xiàng)目
- 4.2.1.6. 測(cè)試API的調(diào)用
- 4.2.1.6.1. 直接打開(kāi)網(wǎng)頁(yè)版
- 4.2.1.6.2. 代碼測(cè)試
- 4.2.2. docker安裝
- 4.2.3. API調(diào)用
- 5. 報(bào)錯(cuò)
1. 前言
- 之前做爬蟲(chóng)的時(shí)候,經(jīng)常會(huì)遇到對(duì)于一個(gè)網(wǎng)頁(yè),使用同一個(gè)IP多次會(huì)被禁掉IP的問(wèn)題,我們可以自己手動(dòng)更換代理IP再繼續(xù)這個(gè)問(wèn)題但多少會(huì)有點(diǎn)麻煩,我對(duì)于一個(gè)懶人來(lái)說(shuō),手動(dòng)更換IP太麻煩,而且也不符合程序員懶惰的美德,于是便有了下面的故事。
- proxy_pool 是一個(gè)開(kāi)源的代理池,聚合了各大免費(fèi)的 ip 代理池。當(dāng)自己的爬蟲(chóng)因?yàn)榕赖奶炝?ip 被封了的時(shí)候,代理池就可以派上用場(chǎng)啦
- 爬蟲(chóng)代理IP池項(xiàng)目,主要功能為定時(shí)采集網(wǎng)上發(fā)布的免費(fèi)代理驗(yàn)證入庫(kù),定時(shí)驗(yàn)證入庫(kù)的代理保證代理的可用性,提供API和CLI兩種使用方式。同時(shí)你也可以擴(kuò)展代理源以增加代理池IP的質(zhì)量和數(shù)量。
2. 教程
- 部署自己的代理池 - idealclover
3. 官網(wǎng)
- GitHub - jhao104/proxy_pool: Python爬蟲(chóng)代理IP池(proxy pool)
4. 在線demo
- demo.spiderpy.cn/
4.1. 本地部署
4.2. 安裝
- python爬蟲(chóng)添加代理ip池ProxyPool (Windows) - 灰信網(wǎng)(軟件開(kāi)發(fā)博客聚合)
4.2.1. Python源碼構(gòu)建安裝
4.2.1.1. 安裝redis數(shù)據(jù)庫(kù)
4.2.1.1.1. 下載redis源碼
- Windows下安裝Redis圖文教程_喵代王-香菜的博客-CSDN博客_windows安裝redis
- windows首先下載安裝Redis安裝包,并解壓到合適位置(放哪都行)
4.2.1.1.2. 啟動(dòng)redis服務(wù)
- cmd進(jìn)入文件位置
- redis-server.exe redis.windows.conf
4.2.1.1.3. 安裝redis服務(wù)
- 再打開(kāi)一個(gè)cmd窗口,輸入下面的命令,將Redis安裝到Windows服務(wù)中
- redis-server --service-install redis.windows.conf
- 查看是否添加進(jìn)去了服務(wù)
- services.msc
4.2.1.1.4. 再次通過(guò)命令啟動(dòng)redis服務(wù)
- 關(guān)閉第一個(gè)“啟動(dòng)服務(wù)”cmd窗口,另開(kāi)一個(gè)cmd窗口,啟動(dòng)服務(wù)
- redis-server --service-start
- 關(guān)閉服務(wù)命令
- redis-server --service-stop
4.2.1.1.5. 測(cè)試redis服務(wù)是否可用
- redis-cli.exe -h 127.0.0.1 -p 6379
- 如果沒(méi)報(bào)錯(cuò),并且顯示下面的界面的話,就表示這個(gè)redis服務(wù)現(xiàn)在可用
4.2.1.2. 下載proxy_pool源碼
git clone git@github.com:jhao104/proxy_pool.git- 如果無(wú)法通過(guò)這種方法克隆的話,就手動(dòng)下載吧
- 或者直接下載特定的release版本
- Releases · jhao104/proxy_pool · GitHub
4.2.1.3. 安裝依賴
pip install -r requirements.txt4.2.1.4. 更新配置
- 配置文件 setting.py 位于項(xiàng)目的主目錄下:
4.2.1.4.1. 配置參數(shù)
- 配置參考 — ProxyPool 2.1.0 文檔
- 配置參數(shù)說(shuō)明
- 服務(wù)配置
- HOST
- API服務(wù)監(jiān)聽(tīng)的IP, 本機(jī)訪問(wèn)設(shè)置為 127.0.0.1, 開(kāi)啟遠(yuǎn)程訪問(wèn)設(shè)置為: 0.0.0.0
- PORT
- API服務(wù)監(jiān)聽(tīng)的端口.
- 數(shù)據(jù)庫(kù)配置
- DB_CONN
- 用戶存放代理IP的數(shù)據(jù)庫(kù)URI, 配置格式為: db_type://[[user]:[pwd]]@ip:port/[db]
- 目前支持的db_type有: ssdb 、 redis.
- DB_CONN配置示例
- TABLE_NAME
- 存放代理的數(shù)據(jù)載體名稱, ssdb和redis的存放結(jié)構(gòu)為hash.
- 采集配置
- PROXY_FETCHER
- 啟用的代理采集方法名, 代理采集方法位于 fetcher/proxyFetcher.py 類中.
- 由于各個(gè)代理源的穩(wěn)定性不容易掌握, 當(dāng)某個(gè)代理采集方法失效時(shí), 可以該配置中注釋掉其名稱.
- 如果有增加某些代理采集方法, 也請(qǐng)?jiān)谠撆渲弥刑砑悠浞椒? 具體請(qǐng)參考 /dev/extend_fetcher.
- 調(diào)度程序每次執(zhí)行采集任務(wù)時(shí)都會(huì)再次加載該配置, 保證每次運(yùn)行的采集方法都是有效的.
- 這里需要實(shí)時(shí)進(jìn)行更新
- 校驗(yàn)配置
- HTTP_URL
- 用于檢驗(yàn)代理是否可用的地址, 默認(rèn)為 http://httpbin.org ,可根據(jù)使用場(chǎng)景修改為其他地址.
- HTTPS_URL
- 用于檢驗(yàn)代理是否支持HTTPS的地址, 默認(rèn)為 https://www.qq.com ,可根據(jù)使用場(chǎng)景修改為其他地址.
- VERIFY_TIMEOUT
- 檢驗(yàn)代理的超時(shí)時(shí)間, 默認(rèn)為 10 , 單位秒. 使用代理訪問(wèn) HTTP(S)_URL 耗時(shí)超過(guò) VERIFY_TIMEOUT 時(shí), 視為代理不可用.
- MAX_FAIL_COUNT
- 檢驗(yàn)代理允許最大失敗次數(shù), 默認(rèn)為 0, 即出錯(cuò)一次即刪除.
- POOL_SIZE_MIN
- 代理檢測(cè)定時(shí)任務(wù)運(yùn)行前若代理數(shù)量小于 POOL_SIZE_MIN, 則先運(yùn)行抓取程序.
4.2.1.4.2. 配置參數(shù)案例
# Config.ini 為項(xiàng)目配置文件 # 配置DB type = SSDB # 如果使用SSDB或redis數(shù)據(jù)庫(kù),均配置為SSDB host = localhost # db host port = 6379 # db port name = proxy # 默認(rèn)配置 # 配置 ProxyGetter freeProxyFirst = 1 # 這里是啟動(dòng)的抓取函數(shù),可在ProxyGetter/getFreeProxy.py 擴(kuò)展 freeProxySecond = 1 .... # 配置 HOST (api服務(wù)) ip = 127.0.0.1 # 監(jiān)聽(tīng)ip,0.0.0.0開(kāi)啟外網(wǎng)訪問(wèn) port = 5010 # 監(jiān)聽(tīng)端口 # 上面配置啟動(dòng)后,代理api地址為 http://127.0.0.1:5010- 第一個(gè)port是你數(shù)據(jù)庫(kù)的端口號(hào), 第二個(gè)是api的端口號(hào)
- 目標(biāo)計(jì)算機(jī)積極拒絕 · Issue #118 · jhao104/proxy_pool · GitHub
4.2.1.5. 啟動(dòng)項(xiàng)目
- 如果已配置好運(yùn)行環(huán)境, 具備運(yùn)行條件, 可以通過(guò) proxyPool.py 啟動(dòng). proxyPool.py 是項(xiàng)目的CLI入口. 完整程序包含兩部份: schedule 調(diào)度程序和 server API服務(wù), 調(diào)度程序負(fù)責(zé)采集和驗(yàn)證代理, API服務(wù)提供代理服務(wù)HTTP接口.
- 通過(guò)命令行程序分別啟動(dòng) 調(diào)度程序和API服務(wù):
- 啟動(dòng)調(diào)度程序:python proxyPool.py schedule
- 可以看到,正在采集對(duì)于IP,有的成功,有的失敗
- 最終穩(wěn)定下來(lái)
- 再開(kāi)一個(gè)命令號(hào),啟動(dòng)webApi服務(wù):python proxyPool.py server
4.2.1.6. 測(cè)試API的調(diào)用
4.2.1.6.1. 直接打開(kāi)網(wǎng)頁(yè)版
- 127.0.0.1:5010/get/
- http://127.0.0.1:5010/get/
- 這里需要注意的是,網(wǎng)址端口應(yīng)該改成自己之前定義的端口
- 每一次刷新上面的代理IP地址都會(huì)發(fā)生改變
4.2.1.6.2. 代碼測(cè)試
import requests def get_proxy(): #5000:settings中設(shè)置的監(jiān)聽(tīng)端口,不是Redis服務(wù)的端口 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- 運(yùn)行
4.2.3. API調(diào)用
啟動(dòng)web服務(wù)后, 默認(rèn)配置下會(huì)開(kāi)啟127.0.0.1:5010/ 的api接口服務(wù):
參數(shù)
5. 報(bào)錯(cuò)
-
ValueError: invalid literal for int() with base 10: ‘port’
-
可能是一個(gè)端口不可用吧,在GUI界面中修改一下端口號(hào)就好了
-
redis.exceptions.ConnectionError: Error 10061 connecting to 127.0.0.1:6379. 由于目標(biāo)計(jì)算機(jī)積極拒絕,無(wú)法連接。.2022-12-24 20:52:10,677 launcher.py[line:39] INFO exit!
-
可能只是自己參數(shù)設(shè)置的不對(duì)吧
-
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的賬號(hào)密碼設(shè)置的不對(duì)
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里面的版本號(hào)刪掉 重新pip install 一下
-
pip uninstall -r requirements.txt
-
pip install -r requirements.txt
-
運(yùn)行出錯(cuò)! · 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] 由于目標(biāo)計(jì)算機(jī)積極拒絕,無(wú)法連接。’))
-
很簡(jiǎn)單,端口不匹配,更改即可
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] 由于目標(biāo)計(jì)算機(jī)積極拒絕,無(wú)法連接。’))
- 很簡(jiǎn)單,端口不匹配,更改即可
[外鏈圖片轉(zhuǎn)存中…(img-nAUDtJec-1671896468370)]
總結(jié)
以上是生活随笔為你收集整理的使用proxy_pool来为爬虫程序自动更换代理IP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring Security 短信验证
- 下一篇: 上岸学长学姐留下的24个考研秘诀