Python HTTPS 爬蟲(chóng)實(shí)戰(zhàn),requests aiohttp Selenium 抓取技巧、HTTPS 問(wèn)題與抓包調(diào)試(python https爬蟲(chóng)、反爬、抓包、證書(shū)處理)

在爬蟲(chóng)實(shí)戰(zhàn)里,遇到 HTTPS 站點(diǎn)是日常。HTTPS 本質(zhì)上在傳輸層加密,但對(duì)爬蟲(chóng)影響主要落在證書(shū)驗(yàn)證、重定向、HTTP/2、SNI、壓縮以及反爬策略上。本文面向工程實(shí)現(xiàn),講清用 Python 抓 HTTPS 的常見(jiàn)方案、實(shí)用代碼、遇到證書(shū)/加密/反爬時(shí)的處理辦法,以及如何用抓包工具定位問(wèn)題(包含在移動(dòng)端或真機(jī)場(chǎng)景下用 抓包大師 Sniffmaster 的補(bǔ)充方法)。


一、常見(jiàn)工具與選型

  • requests:同步、易上手,適合普通頁(yè)面與 API。
  • aiohttp / httpx (async):并發(fā)抓取,高吞吐場(chǎng)景首選。
  • Selenium / Playwright:渲染 JS、處理復(fù)雜交互與驗(yàn)證碼。
  • mitmproxy / Charles / Fiddler:抓包與調(diào)試 HTTPS 請(qǐng)求;mitmproxy 支持 Python 腳本化。
  • tcpdump/Wireshark/Sniffmaster:遇到 TLS 握手失敗或移動(dòng)端問(wèn)題時(shí)做底層/真機(jī)抓包。

二、基礎(chǔ)代碼示例(requests 與證書(shū)校驗(yàn))

import requests

url = "https://example.com/api"
s = requests.Session()
s.headers.update({"User-Agent": "Mozilla/5.0 (compatible)"})
resp = s.get(url, timeout=10)  # 默認(rèn) verify=True,會(huì)校驗(yàn)證書(shū)
print(resp.status_code, resp.headers.get('content-type'))

如果遇到自簽或測(cè)試證書(shū),可指定 CA 文件:

resp = s.get(url, verify="/path/to/ca_bundle.pem")

切記verify=False 可臨時(shí)調(diào)試,但有安全風(fēng)險(xiǎn),不應(yīng)用于生產(chǎn)。


三、并發(fā)抓?。╝iohttp 快速示例)

import asyncio, aiohttp

async def fetch(session, url):
    async with session.get(url, ssl=True) as r:
        return await r.text()

async def main(urls):
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, u) for u in urls]
        res = await asyncio.gather(*tasks)
        print(len(res))

# asyncio.run(main(list_of_urls))

aiohttp 可以傳入自定義 ssl 上下文以處理證書(shū)問(wèn)題或 SNI。


四、常見(jiàn) HTTPS 與抓取問(wèn)題及對(duì)策

1) 證書(shū)驗(yàn)證失敗(CERTIFICATE_VERIFY_FAILED

  • 檢查本機(jī) certifi 是否最新;在受控測(cè)試環(huán)境使用自建 CA 并把 CA 導(dǎo)入系統(tǒng)/requests 的 CA bundle。
  • openssl s_client -connect host:443 -servername host 查看服務(wù)器證書(shū)鏈。

2) 重定向與 Cookie 簽名

  • 使用 Session() 保持 cookie。很多接口簽名會(huì)把時(shí)間戳、nonce 與 cookie 聯(lián)動(dòng),務(wù)必統(tǒng)一會(huì)話并重試策略。

3) 壓縮/編碼顯示為亂碼

  • 檢查 Content-Encoding(gzip、br),requests/aiohttp 通常會(huì)自動(dòng)解壓;若返回二進(jìn)制(protobuf/圖片),用對(duì)應(yīng)解析器處理。

4) HTTP/2 / TLS 特性

  • requests 默認(rèn)走 HTTP/1.1;若需 HTTP/2 可使用 httpxhyper,部分站點(diǎn)僅在 HTTP/2 下才返回期望內(nèi)容。

5) SNI 與多域名

  • 使用支持 SNI 的 OpenSSL(大多現(xiàn)代 Python 都支持);若遇到證書(shū)與域名不一致,檢查客戶端請(qǐng)求中的 servername。

五、應(yīng)對(duì)反爬與抗封策略(工程化)

  • Header 與 UA 升級(jí):偽裝常用瀏覽器 UA、Referer、Accept-Language。
  • IP 輪換/代理池:短期用高匿名代理并控制速率;對(duì)于重要項(xiàng)目,使用付費(fèi)代理并統(tǒng)計(jì)失效率。
  • 請(qǐng)求速率與隨機(jī)延遲:尊重 robots.txt、避免高并發(fā)短時(shí)突發(fā)。
  • 瀏覽器行為模擬:用 Selenium/Playwright 渲染并執(zhí)行 JS、觸發(fā)瀏覽器指紋(但需控制并發(fā)與資源)。
  • 驗(yàn)證碼:優(yōu)先避免觸發(fā),必要時(shí)結(jié)合人工/第三方識(shí)別服務(wù)。
  • 簽名逆向:如果接口有簽名算法,逆向客戶端 JS / APP 簽名邏輯或使用同構(gòu)環(huán)境復(fù)現(xiàn)簽名(注意合規(guī))。

六、抓包與調(diào)試 HTTPS 的實(shí)際流程

  1. 本地用 requests 發(fā)請(qǐng)求并復(fù)現(xiàn)問(wèn)題。
  2. mitmproxy 或 Charles 做代理抓包,觀察請(qǐng)求頭、TLS 握手、重定向與響應(yīng)體。mitmproxy 支持寫(xiě)腳本修改請(qǐng)求并記錄日志。
  3. 當(dāng)代理看不到流量或 App/移動(dòng)端行為異常,可能是 Pinning、mTLS 或 App 使用原始套接字:這時(shí)需要真機(jī)抓包或底層抓包
    • 桌面可用 tcpdump + Wireshark 分析 ClientHello/Alert。
    • iOS/Android 真機(jī)場(chǎng)景,普通代理常被拒絕,這時(shí)可以使用 USB 直連抓包工具(例如 抓包大師 Sniffmaster)直接捕獲設(shè)備流量、按 App 過(guò)濾并導(dǎo)出 PCAP,方便在 Wireshark 中進(jìn)一步分析 TLS 握手與證書(shū)鏈問(wèn)題。

七、mitmproxy 用于自動(dòng)化調(diào)試(小示例)

# save as addon.py
from mitmproxy import http

def response(flow: http.HTTPFlow):
    if "api.example.com" in flow.request.host:
        # 打印或修改響應(yīng),或記錄原始 body
        print(flow.response.status_code, len(flow.response.content))

運(yùn)行:mitmproxy -s addon.py,并在請(qǐng)求中指定代理。適合在爬蟲(chóng)開(kāi)發(fā)時(shí)做斷點(diǎn)調(diào)試或自動(dòng)注入。


八、合規(guī)與風(fēng)險(xiǎn)提示

抓取數(shù)據(jù)前務(wù)必確認(rèn)目標(biāo)網(wǎng)站的使用條款與法律合規(guī);在生產(chǎn)環(huán)境或客戶數(shù)據(jù)上進(jìn)行抓包/存儲(chǔ)時(shí)要做好脫敏與權(quán)限控制。對(duì)付驗(yàn)證碼或繞過(guò)認(rèn)證時(shí)尤須慎重,優(yōu)先尋求授權(quán)測(cè)試環(huán)境或 API 合作。


構(gòu)建穩(wěn)定的 Python HTTPS 爬蟲(chóng)需要把請(qǐng)求實(shí)現(xiàn)、證書(shū)與 TLS 兼容、反爬策略與抓包調(diào)試這幾部分當(dāng)成工程化流程來(lái)做。日常建議是:用 requests/aiohttp 做主抓取,用 mitmproxy/Charles 做抓包調(diào)試;當(dāng)遇到移動(dòng)端/真機(jī)或 Pinning/mTLS 難題時(shí),把 Sniffmaster 作為排查鏈路的一部分,結(jié)合 Wireshark 做握手級(jí)別分析。把重試、代理池、限速、日志與監(jiān)控整合后,爬蟲(chóng)穩(wěn)定性會(huì)顯著提升。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容