文章目錄
- ConnectionResetError(10054, '遠程主機強迫關閉了一個現有的連接
- 1.問題描述
- 2.嘗試的解決方法(均未生效)
- 2.1 請求重試機制
- 2.2 模擬瀏覽器請求頭
- 2.3 關閉連接資源
- 2.4 延遲訪問
- 3.解決方案:使用 proxy_pool IP 代理池
- 最后
- 參考文章
ConnectionResetError(10054, '遠程主機強迫關閉了一個現有的連接
1.問題描述
在進行爬蟲開發時,頻繁遇到以下報錯:
Connection aborted: ConnectionResetError(10054, '遠程主機強迫關閉了一個現有的連接。')
這是由于目標服務器將爬蟲行為識別為異常或惡意訪問,觸發了安全機制(如防火墻、WAF),從而強制關閉連接。
2.嘗試的解決方法(均未生效)
2.1 請求重試機制
對 requests.get(url)
添加重試邏輯,如失敗最多嘗試 20 次。
for i in range(20):try:response = requests.get(url)breakexcept Exception as e:time.sleep(1)
2.2 模擬瀏覽器請求頭
在請求中添加常見的 headers,如 User-Agent
、Referer
、Accept-Language
等。
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',"Accept-Language": "zh-CN,zh;q=0.9"}
2.3 關閉連接資源
在請求后調用 response.close()
主動釋放連接資源,防止連接堆積。
2.4 延遲訪問
控制訪問頻率,如通過 time.sleep()
降低請求頻率,依舊無效。
3.解決方案:使用 proxy_pool IP 代理池
最終通過引入 IP 代理池 解決了問題,避免了目標服務器根據 IP 頻率封鎖爬蟲請求。
- GitHub 地址:https://github.com/jhao104/proxy_pool
- 項目名稱:proxy_pool
配置步驟:
1、克隆項目并安裝依賴
git clone https://github.com/jhao104/proxy_pool.git
cd proxy_pool
pip install -r requirements.txt
2、Redis本地配置一下
3、啟動代理池服務
# 啟動調度程序
python proxyPool.py schedule# 啟動webApi服務
python proxyPool.py server
4、代碼中應用
封裝兩個功能,分別是獲取IP和刪除池子中的IP。
# proxypool ip池代理
PROXY_POOL_URL = "http://127.0.0.1:5010/get/"
def get_proxy():try:return requests.get("http://127.0.0.1:5010/get/").json().get("proxy")except Exception as e:print(f"[代理獲取失敗] {repr(e)}")return None
def delete_proxy(proxy):try:requests.get(f"http://127.0.0.1:5010/delete/?proxy={proxy}")except Exception as e:print(f"[代理刪除失敗] {repr(e)}")
實際應用,解決獲取問題(代碼僅保留邏輯信息,相關私密數據不保留):
def down_img(img_url, retry_count=30):ext = os.path.splitext(parse.urlparse(img_url).path)[1].lower().lstrip(".")if ext not in ["jpg", "jpeg", "png", "gif", "svg", "webp"]:ext = "jpg"image_dir = os.path.join(current_dir, "x", "x", "x", "x")os.makedirs(image_dir, exist_ok=True)image_name = (f"xxx")image_path = os.path.join(image_dir, image_name)while retry_count > 0:proxy = get_proxy() # 1.獲取proxy ipif not proxy:print("Error:無可用代理,無法下載")return Noneproxies = {"http": f"http://{proxy}", "https": f"http://{proxy}"}try:with requests.get(img_url, proxies=proxies, timeout=10, stream=True) as response: # 2.獲取鏈接相關數據response.raise_for_status()with open(image_path, "wb") as f: # 3.圖片本地化for chunk in response.iter_content(chunk_size=8192):f.write(chunk)print(f"[成功] 下載圖片到:{image_path}")return xxxxexcept Exception as e:retry_count -= 1delete_proxy(proxy)print(f"[最終失敗] 無法下載圖片:{img_url}")
實現成果:redis proxy_pool ip 存儲 和 終端完成打印
Successful! 成功解決問題。
最后
- 該類連接被重置的錯誤,單純通過重試、偽裝 UA 或請求頭等手段已不足以繞過限制。
- 使用高質量的 IP 代理池最有效,配合隨機代理策略可提高爬蟲的穩定性和成功率。
參考文章
1、https://blog.csdn.net/xunxue1523/article/details/104662965
2、https://www.cnblogs.com/AubeLiang/p/17756844.html
3、https://github.com/jhao104/proxy_pool