整体思路
- 模拟浏览器访问知乎回答页面
- 获取页面HTML内容
- 解析HTML,提取回答正文
- 输出回答内容
模块说明
requests
模块:用于发送HTTP请求获取网页内容BeautifulSoup
模块:用于解析HTML文档,提取所需数据
import requests
from bs4 import BeautifulSoup
url = 'https://www.zhihu.com/question/{question:id}'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36','Referer': 'https://www.zhihu.com/', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
}
cookie_str = {'d_c0': '你的d_c0值','_zap': '你的_zap值',}
response = requests.get(url, headers=headers, cookies=cookies)
if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')answer_div = soup.find('div', class_='RichContent-inner') if answer_div:content = answer_div.get_text(separator="\n", strip=True)print("\n📌 回答内容提取成功:\n")print(content)else:print("❌ 没有找到回答内容区域,可能页面结构变了或未加载完全。")
else:print(f"❌ 请求失败,状态码: {response.status_code}")
提问:为什么需要同时使用Headers和Cookies?
Headers和Cookies的区别
1. Headers(请求头)的作用
- 模拟浏览器行为:
User-Agent
告诉服务器你使用的是哪种浏览器 - 控制内容协商:
Accept
系列头部告诉服务器你希望接收什么类型的内容 - 提供来源信息:
Referer
告诉服务器你从哪个页面跳转过来 - 语言偏好:
Accept-Language
指定你希望接收的语言版本
2. Cookies的作用
- 身份认证:包含登录状态(token/session)和其他认证信息
- 跟踪用户:维护会话状态,记录用户偏好
- 反爬机制:很多网站用cookie验证请求的合法性
为什么知乎需要两者
仅用Headers的问题
- 你可以模拟浏览器,但没有身份凭证
- 知乎会知道你是一个"未登录用户"
- 可能遇到:
- 请求被重定向到登录页面
- 只能看到部分内容(如只显示前几个回答)
- 频繁请求会被识别为爬虫并封禁
仅用Cookies的问题
- 虽然有了身份凭证,但请求看起来不像正常浏览器
- 可能被安全系统拦截
- 缺少必要的头部信息可能导致服务器返回错误响应
实际案例分析
知乎的典型验证机制
- 首次检查Headers:
- 是否看起来像真实浏览器(User-Agent)
- 是否有合理的来源(Referer)
- 二次验证Cookies:
_xsrf
:防止CSRF攻击的tokenz_c0
:登录凭证d_c0
:设备标识
- 综合判断:
- 如果只有Headers没有Cookies → 当作未登录用户处理
- 如果只有Cookies没有合理Headers → 可能当作可疑请求
最佳实践建议
- 保持两者完整性:
- Headers要尽可能模拟真实浏览器
- Cookies需要定期更新(特别是登录凭证)
- 获取最新Cookies的方法:
- 登录知乎后,按F12打开开发者工具
- 进入Network(网络)选项卡
- 刷新页面
- 找到任意请求,复制Request Headers中的Cookie
- 反爬应对:
- 适当添加延迟(如time.sleep)
- 考虑使用会话(Session)对象保持状态
- 监控响应状态码(403/429等表示可能被限制)