獲取網頁內容 response = requests.get(url, verify=False) 通過這種方式下載網址不太靠譜, 容易出 ssl錯誤 requests.exceptions.SSLError: HTTPSConnectionPool(host='agri.hainan.gov.cn', port=443): Max retries exceeded with url: /hnsnyt/xxgk/gfxwj/index_1.html (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1006)'))) , 下面是給出靠譜的做法
如果你希望使用更加安全和可靠的方式下載網頁內容,并且希望避免 requests
中的 SSL 問題,有幾個替代方案和改進方法,可以更好地處理 SSL 驗證、證書問題等。以下是幾種更安全的方法:
方法 1: 使用 httpx
庫
httpx
是 requests
的一個替代庫,支持異步請求,也有更好的 SSL 驗證功能。httpx
默認會進行 SSL 證書驗證,但可以在需要時進行配置。
安裝 httpx
:
pip install httpx
使用示例:
import httpxurl = 'https://agri.hainan.gov.cn/hnsnyt/xxgk/gfxwj/index_1.html'# 創建一個客戶端對象
with httpx.Client() as client:response = client.get(url)print(response.text)
如果你遇到 SSL 錯誤,可以通過調整 verify
參數來禁用 SSL 驗證,盡管這仍然不推薦用于生產環境:
response = client.get(url, verify=False)
方法 2: 使用 urllib3
庫
urllib3
是 Python 的一個高級 HTTP 客戶端,處理 SSL 的方式比 requests
更加底層,適合需要精細控制 SSL 配置的場景。你可以通過 urllib3
來下載網頁并管理 SSL 設置。
安裝 urllib3
:
pip install urllib3
使用示例:
import urllib3# 創建一個 PoolManager,支持更細粒度的控制
http = urllib3.PoolManager()url = 'https://agri.hainan.gov.cn/hnsnyt/xxgk/gfxwj/index_1.html'# 禁用 SSL 驗證(如果不關心安全)
response = http.request('GET', url, retries=3, timeout=5.0)
print(response.data.decode('utf-8'))
如果你希望進行更精細的 SSL 配置,可以直接使用 SSLContext
來設置證書驗證。
方法 3: 使用 aiohttp
(異步請求)
如果你需要進行多個異步 HTTP 請求,aiohttp
是一個非常強大的異步 HTTP 客戶端庫,支持協程,可以讓你以更高效的方式進行網絡請求。它也有更好的 SSL 處理機制。
安裝 aiohttp
:
pip install aiohttp
使用示例:
import aiohttp
import asyncioasync def fetch(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:return await response.text()url = 'https://agri.hainan.gov.cn/hnsnyt/xxgk/gfxwj/index_1.html'# 異步運行
html = asyncio.run(fetch(url))
print(html)
如果遇到 SSL 問題,可以通過 verify_ssl
參數來禁用 SSL 驗證:
async with session.get(url, ssl=False) as response:
方法 4: 使用 pycurl
庫(更底層,支持更多配置)
pycurl
是 Python 對 libcurl
的封裝,提供了更多的配置選項,特別適合對 SSL 證書和協議進行精細控制。
安裝 pycurl
:
pip install pycurl
使用示例:
import pycurl
from io import BytesIOurl = 'https://agri.hainan.gov.cn/hnsnyt/xxgk/gfxwj/index_1.html'# 創建一個緩沖區來接收響應
buffer = BytesIO()# 創建 cURL 對象
c = pycurl.Curl()
c.setopt(c.URL, url)
c.setopt(c.WRITEDATA, buffer)# 禁用 SSL 驗證
c.setopt(c.SSL_VERIFYPEER, 0) # 不驗證對方的證書
c.setopt(c.SSL_VERIFYHOST, 0) # 不驗證主機# 執行請求
c.perform()# 獲取結果
response = buffer.getvalue().decode('utf-8')
print(response)
方法 5: 使用 certifi
自定義證書路徑
如果 SSL 錯誤是由于缺少根證書,你可以通過 certifi
來確保使用最新的證書鏈。 certifi
提供了 Mozilla 的證書集合,可以幫助你避免 SSL 錯誤。
安裝 certifi
:
pip install certifi
然后你可以在請求中顯式地指定證書路徑,確保使用最新的根證書。
import requests
import certifiurl = 'https://agri.hainan.gov.cn/hnsnyt/xxgk/gfxwj/index_1.html'
response = requests.get(url, verify=certifi.where()) # 使用 certifi 的證書路徑
print(response.text)
總結:
httpx
: 推薦用httpx
庫來替代requests
,它有更強的 SSL 處理和更高的靈活性。urllib3
: 提供更多底層控制,適合精細的 SSL 配置。aiohttp
: 異步請求,適合進行并發下載操作。pycurl
: 如果你需要完全控制 HTTP 請求和 SSL 配置,pycurl
是非常強大的選擇。certifi
: 確保 SSL 證書驗證使用最新的證書集。
這些方案都能夠在保證安全性的前提下處理 SSL 問題。如果你遇到的主要問題是 SSL 證書問題,確保使用較新的證書鏈,并避免在生產環境中禁用 SSL 驗證。