当前位置: 首页 > web >正文

Python爬虫实战:爬取知乎回答详情

整体思路

  1. 模拟浏览器访问知乎回答页面
  2. 获取页面HTML内容
  3. 解析HTML,提取回答正文
  4. 输出回答内容

模块说明

  1. requests模块:用于发送HTTP请求获取网页内容
  2. BeautifulSoup模块:用于解析HTML文档,提取所需数据
# 导入必要的库
import requests  # 用于发送HTTP请求
from bs4 import BeautifulSoup  # 用于解析HTML文档# 要爬取的知乎回答页面 URL
# 这是一个示例URL,可以替换成你想爬取的其他知乎回答链接
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 字符串转为字典(这里只保留关键字段)
# Cookie是网站用来识别用户身份的重要信息,需要从浏览器中获取
# 注意:实际使用时应该从浏览器中获取最新的cookie,这个示例cookie可能已过期
cookie_str = {'d_c0': '你的d_c0值','_zap': '你的_zap值',# 添加其他必要的cookies}# 发起GET请求
# 使用requests.get方法发送请求,带上headers和cookies
response = requests.get(url, headers=headers, cookies=cookies)# 检查响应状态码
# 200表示请求成功
if response.status_code == 200:# 使用BeautifulSoup解析HTML内容,'html.parser'是Python内置的HTML解析器soup = BeautifulSoup(response.text, 'html.parser')# 查找回答正文区域# 知乎的回答内容通常位于class为'RichContent-inner'的div标签中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的问题

  • 虽然有了身份凭证,但请求看起来不像正常浏览器
  • 可能被安全系统拦截
  • 缺少必要的头部信息可能导致服务器返回错误响应

实际案例分析

知乎的典型验证机制

  1. 首次检查Headers
    • 是否看起来像真实浏览器(User-Agent)
    • 是否有合理的来源(Referer)
  2. 二次验证Cookies
    • _xsrf:防止CSRF攻击的token
    • z_c0:登录凭证
    • d_c0:设备标识
  3. 综合判断
    • 如果只有Headers没有Cookies → 当作未登录用户处理
    • 如果只有Cookies没有合理Headers → 可能当作可疑请求

最佳实践建议

  1. 保持两者完整性
    • Headers要尽可能模拟真实浏览器
    • Cookies需要定期更新(特别是登录凭证)
  2. 获取最新Cookies的方法
    • 登录知乎后,按F12打开开发者工具
    • 进入Network(网络)选项卡
    • 刷新页面
    • 找到任意请求,复制Request Headers中的Cookie
  3. 反爬应对
    • 适当添加延迟(如time.sleep)
    • 考虑使用会话(Session)对象保持状态
    • 监控响应状态码(403/429等表示可能被限制)
http://www.xdnf.cn/news/13311.html

相关文章:

  • WebRTC(二):工作机制
  • CARSIM-车速、油门、刹车练习
  • 【计网】作业7
  • 金属矫平机:塑造平整与精度的工业利器
  • 【机器视觉】单目测距——运动结构恢复
  • synchronized 学习
  • 计算机网络笔记(三十四)——5.6TCP可靠传输的实现
  • 【持续更新】linux网络编程试题
  • 优化篇 | 网络时延优化有哪些项
  • ARM 单片机定义变量绝对地址方法
  • umask命令详解
  • 如何在Debian中提高phpstorm的稳定性
  • PostgreSQL 安装与配置全指南(适用于 Windows、macOS 与主流 Linux 发行版)
  • <6>-MySQL表的增删查改
  • Fastapi的swagger文档响应超时无法访问的解决办法
  • mybatisplus.BaseMapper#selectPage 使用方法
  • 服务器内存能不能用在台式机上
  • 模板语法中的插值语法详解
  • innodb 数据页结构
  • SpringBoot集成Tess4j :低成本解锁OCR 图片识别能力
  • 论文略读: CUT YOUR LOSSES IN LARGE-VOCABULARY LANGUAGE MODELS
  • YSYX学习记录(八)
  • 【51单片机】5. 矩阵键盘与矩阵键盘密码锁Demo
  • Debian系统简介
  • R7-4 统计单词的个数
  • 电影感户外柔和旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • C++ 智能指针
  • postgresql搭建与初始化
  • EtherCAT转CC-Link IE协议转换通讯助力库卡机器人与三菱PLC无缝对接
  • 【Linux篇】细品环境变量与地址空间