Python 第二階段 - 爬蟲入門
🎯 今日目標
- 學習什么是 Cookie / Session,為什么要維持登錄狀態
- 掌握
requests.Session
用法 - 模擬登錄一個帶登錄表單的網站
- 獲取登錄后的頁面內容
📘 學習內容詳解
🔐 什么是 Session?
很多網站內容需要登錄后才能訪問。登錄后,服務器會發給瀏覽器一個 SessionID(或 Cookie),作為用戶身份憑證。
如果你想爬取登錄后的頁面,就必須“模擬登錄”并“保持會話”。
🔁 requests.Session
的作用
使用 requests.Session
() 可以:
- 自動保存 Cookie
- 在多個請求之間維持登錄狀態
💻 示例:模擬登錄測試網站
我們使用 httpbin.org 模擬登錄行為(演示形式):
import requests# 創建一個 session 對象
session = requests.Session()# 構造表單數據(假設是登錄表單)
login_data = {"username": "testuser","password": "testpass"
}# 模擬登錄請求
login_url = "https://httpbin.org/post"
response = session.post(login_url, data=login_data)print("登錄響應內容:")
print(response.json()) # httpbin 會返回你提交的內容# 接著訪問其他頁面(此時自動帶上了登錄 Cookie)
another_response = session.get("https://httpbin.org/cookies")
print("\n帶 Cookie 的請求結果:")
print(another_response.text)
🎯 模擬實際登錄網站(僅測試用途)
有些網站登錄邏輯如下:
- 表單地址:https://example.com/login
- 提交字段:username=
xxx&password=xxx&csrf_token=xxx
- 需要使用 headers 模擬瀏覽器
- 可能還需要驗證碼(此類需用 Selenium)
🧪 今日練習任務
-
使用
requests.Session()
模擬一個簡單的表單提交(如 httpbin.org 或本地測試站點)import requests# 創建 Session 對象(自動保存 cookie) session = requests.Session()# 模擬登錄表單數據 login_data = {"username": "testuser","password": "123456" }# 表單提交地址(httpbin.org 用于測試,會返回你提交的所有數據) login_url = "https://httpbin.org/post"# 發送 POST 請求 response = session.post(login_url, data=login_data)# 查看服務器返回的 JSON 數據 print("? 登錄請求返回內容:") print(response.json())# 模擬登錄成功后,再訪問一個頁面(httpbin 會帶上 cookie) response2 = session.get("https://httpbin.org/cookies") print("\n📦 后續請求中的 Cookie 內容:") print(response2.text)
示例輸出:
? 登錄請求返回內容: {'args': {}, 'data': '', 'files': {}, 'form': {'password': '123456', 'username': 'testuser'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '33', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-684ec172-7f38f51b3f47f06628fc18c7'}, 'json': None, 'origin': '84.17.38.140', 'url': 'https://httpbin.org/post'}📦 后續請求中的 Cookie 內容: {"cookies": {} }
-
觀察響應中的
cookie、form、headers
內容 -
嘗試爬取一個你感興趣的登錄后頁面(如 CSDN 博客后臺、知乎收藏等——可能需要 cookie 手動導入)
- 打開瀏覽器訪問 https://www.zhihu.com
- 手動登錄你的知乎賬戶
- 打開開發者工具(F12)→ Network → 找任意請求
- 查看 Request Headers,復制 Cookie 字符串(很長那一串)
- requests 模擬登錄后的請求
import requests# 將你的 Cookie 字符串復制到這里(注意格式) cookie_str = 'd_c0="xxxx"; q_c1="xxxx"; z_c0="2|1:xxxx";'# 轉換為 dict(你也可以用 browser_cookie3 庫自動導入) cookies = {} for item in cookie_str.split(';'):key, value = item.strip().split('=', 1)cookies[key] = value# 請求登錄后才能訪問的頁面,例如知乎首頁 url = "https://www.zhihu.com/"headers = {"User-Agent": "Mozilla/5.0","Referer": "https://www.zhihu.com/", }response = requests.get(url, headers=headers, cookies=cookies)# 打印網頁前 500 字符,確認是否登錄成功 print(response.text[:500])
🧠 今日總結
- 學會了 Session 的基本概念
- 掌握了
requests.Session()
如何模擬登錄并抓取數據 - 為更復雜的登錄機制(驗證碼、JS登錄)做準備