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登录)做准备