首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Python 爬蟲模擬登入知乎:抓取 POST 資料的正確工具與流程

     編輯:程式設計綜合問答

問題

Chrome DevTools Network 頁面登入請求「一閃而過」,抓不到 POST 資料。

原因

  • 登入流程包含重導向 (302)、預檢請求 (OPTIONS)、多步驟驗證 (滑塊驗證碼、短信、QR Code)。
  • DevTools 預設「Preserve log」未勾選,導航後清除舊記錄。

推薦工具:Fiddler / Charles / mitmproxy

工具特點適用場景
Fiddler Classic / EverywhereWindows/macOS/Linux,系統級代理,可解密 HTTPS,支援斷點修改、重播最通用、教學資源最多
Charles Proxy跨平台,UI 友善,序列化/重播強大Mac 開發者首選
mitmproxy命令列/互動式,Python 腳本擴充,免費開源自動化測試、CI/CD 整合
Chrome DevTools (Preserve log + 按發起者分組)免安裝,但無法攔截修改快速檢視

Fiddler 快速上手抓取登入 POST

  1. 安裝 Fiddler,啟用 HTTPS 解密:Tools → Options → HTTPS → Capture HTTPS CONNECTs、Decrypt HTTPS traffic、安裝根憑證到系統信任存儲。
  2. 瀏覽器設定代理 127.0.0.1:8888 (或用 Fiddler 自動設定)。
  3. 執行登入操作,Fiddler 左側會列出所有請求,含重導向鏈。
  4. 找 POST /login/...,點選 Inspectors → WebForms 查看表單欄位,Raw 查看完整 Header/Body。
  5. 右鍵請求 → Replay → Reissue Requests 可重播測試。

Python 實作登入骨架

import requests
from urllib.parse import urlencode

session = requests.Session()
session.headers.update({
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Referer': 'https://www.zhihu.com/signin',
    'Origin': 'https://www.zhihu.com'
})

# 1. 取得 _xsrf / 驗證碼 / 簽名 等動態參數 (需分析具體流程)
# 知乎現行登入極複雜 (加密簽名、滑塊、設備指紋),建議改用 Selenium/Playwright

# 2. 發送登入 POST (僅示範結構)
login_url = 'https://www.zhihu.com/api/v3/oauth/sign_in'
payload = {
    'client_id': 'c3cef7c66a1843f8b3a9e6a1e3160e20',
    'grant_type': 'password',
    'username': 'your_phone_or_email',
    'password': 'your_password',
    'source': 'com.zhihu.web',
    'lang': 'zh-Hant',
    'ref_source': 'homepage',
    # 'captcha': ..., 'signature': ..., 等動態欄位
}
r = session.post(login_url, data=payload)
print(r.status_code, r.json())

現代替代:Playwright / Selenium

# Playwright (推薦,無頭瀏覽器,自動處理 JS/驗證碼)
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto('https://www.zhihu.com/signin')
    page.fill('input[name="username"]', 'your_account')
    page.fill('input[name="password"]', 'your_password')
    page.click('button:has-text("登入")')
    # 處理滑塊/短信驗證碼...
    page.wait_for_url('https://www.zhihu.com/**')
    cookies = page.context.cookies()
    print(cookies)
    browser.close()

總結建議

  1. 用 Fiddler 完整記錄登入流程,分析每個請求的 Header/Body/重導向。
  2. 知乎等現代網站登入極複雜 (加密、風控、驗證碼),優先用 Playwright/Selenium 真實瀏覽器自動化,而非手工構造 requests。
  3. 若必須用 requests,需完整逆向 JS 加密邏輯 (通常需 Node.js 執行原始 JS 產生簽名)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved