這個錯誤通常是由于SSL/TLS握手失敗導致的,可能原因包括證書驗證問題、不兼容的加密協議或網絡連接中斷。以下是幾種解決方案,按推薦順序排列:
方案一:臨時禁用SSL驗證(快速測試)
response = requests.get(url=url, headers=header, verify=False)
注意:生產環境不推薦長期禁用驗證,存在安全風險
方案二:指定TLS版本(推薦)
response = requests.get(url=url,headers=header,ssl_version='TLSv1_2' # 顯式指定TLS 1.2版本
)
方案三:添加重試機制
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retrysession = requests.Session()
retry = Retry(total=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retry)
session.mount('https://', adapter)response = session.get(url=url, headers=header)
方案四:檢查本地環境
- 更新證書庫:運行
pip install --upgrade certifi
- 檢查系統時間:確保系統時間準確
- 防火墻排查:臨時禁用防火墻/安全軟件測試
方案五:完整改進代碼
import os
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retryurl = 'https://www.hainan.gov.cn/.../files/eae7d9e018bf468794e87e690eef3a95.zip'headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36","Accept": "*/*",
}# 創建帶重試的Session
session = requests.Session()
retry = Retry(total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retry)
session.mount("https://", adapter)try:# 添加超時參數response = session.get(url, headers=headers, timeout=10, verify=True)response.raise_for_status()# 確保目錄存在os.makedirs('test_file', exist_ok=True)with open('test_file/test2.zip', 'wb') as f:f.write(response.content)except requests.exceptions.RequestException as e:print(f"請求失敗: {type(e).__name__}: {e}")
except Exception as e:print(f"其他錯誤: {e}")
補充建議:
- 先在瀏覽器測試:手動訪問該URL確認是否可下載
- 檢查文件路徑:確保
test_file
目錄存在 - 嘗試簡單請求:先用
curl
或Postman測試基本連接性 - 更新依賴庫:
pip install --upgrade requests urllib3
如果問題持續存在,可能是服務器端配置問題(如僅支持特定TLS版本),建議聯系網站管理員確認支持的加密協議。