东方财富股吧push2接口逆向与金融舆情爬虫实战

发布时间:2026/9/10 14:58:51
东方财富股吧push2接口逆向与金融舆情爬虫实战 简介这是一套面向计算机、人工智能及金融相关专业学生与教师的实战型课程资源聚焦股市舆情挖掘与分析场景提供从股吧数据采集到情感识别与热点追踪的完整技术闭环。资源包含12个文件涵盖4个核心Python脚本main.py、crawler.py、parser.py、mongodb.py、4张关键界面截图如发帖/评论界面与进度展示、2张报错与结果示意图、1个JS反爬绕过脚本stealth.min.js及1份Markdown文档说明总大小3.85MB结构清晰、模块分工明确。已有146人学习下载适合作为期末大作业、毕业设计选题或爬虫进阶实践项目。用户可直接运行调试通过的源码获取真实股吧原始数据样本掌握动态网页抓取、文本情感分析含基础实现逻辑、MongoDB存储设计及可视化热点提取等关键技术环节配套文档还梳理了常见异常处理与功能扩展路径。1. 用 Python 抓取东方财富股吧真实评论不是“模拟登录”而是绕过动态渲染与频率拦截的实战方案你可能试过用requests直接请求股吧页面返回的却是空div或window.__INITIAL_STATE__字符串——这不是你代码写错了是东方财富前端早已弃用纯服务端渲染改用 Vue Webpack 构建的单页应用SPA所有评论数据由push2接口异步加载。更关键的是该接口不接受裸User-Agent请求必须携带有效的Referer、Cookie及加密时间戳参数且每分钟调用超过 30 次会触发风控熔断。这不是“爬虫入门练习”而是面向真实金融舆情场景的工程级数据采集你需要稳定获取近 7 天内某只股票如 600519下全部热帖的标题、发帖时间、作者 ID、正文、点赞数、回复数并完成可复现的情感倾向打分与关键词热度排序。适合有 Python 基础、熟悉 HTTP 协议但尚未处理过强反爬站点的量化初学者、金融数据工程师或 NLP 应用开发者——本文不讲 requests 基础语法只聚焦股吧特有的push2接口逆向、参数签名机制还原、以及情感分析链路中真正影响结果的文本清洗细节。2. 解析东方财富股吧push2接口从 Network 面板定位真实数据源与参数生成逻辑2.1 在 Chrome DevTools 中精准捕获push2请求并识别核心参数打开东方财富网eastmoney.com进入任意股票股吧例如 https://guba.eastmoney.com/list,600519,f_1.html按 F12 打开开发者工具切换到 Network 标签页刷新页面。在过滤栏输入push2你会看到一个形如 https://push2.eastmoney.com/api/qt/clist/get?cbjQuery11240282252222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222......## 1. 用 Python 抓取东方财富股吧真实评论不是“模拟登录”而是绕过动态渲染与频率拦截的实战方案你可能试过用requests直接请求股吧页面返回的却是空div或window.__INITIAL_STATE__字符串——这不是你代码写错了是东方财富前端早已弃用纯服务端渲染改用 Vue Webpack 构建的单页应用SPA所有评论数据由push2接口异步加载。更关键的是该接口不接受裸User-Agent请求必须携带有效的Referer、Cookie及加密时间戳参数且每分钟调用超过 30 次会触发风控熔断。这不是“爬虫入门练习”而是面向真实金融舆情场景的工程级数据采集你需要稳定获取近 7 天内某只股票如 600519下全部热帖的标题、发帖时间、作者 ID、正文、点赞数、回复数并完成可复现的情感倾向打分与关键词热度排序。适合有 Python 基础、熟悉 HTTP 协议但尚未处理过强反爬站点的量化初学者、金融数据工程师或 NLP 应用开发者——本文不讲 requests 基础语法只聚焦股吧特有的push2接口逆向、参数签名机制还原、以及情感分析链路中真正影响结果的文本清洗细节。2. 解析东方财富股吧push2接口从 Network 面板定位真实数据源与参数生成逻辑2.1 在 Chrome DevTools 中精准捕获push2请求并识别核心参数打开东方财富网eastmoney.com进入任意股票股吧例如 https://guba.eastmoney.com/list,600519,f_1.html按 F12 打开开发者工具切换到 Network 标签页刷新页面。在过滤栏输入push2你会看到一个形如https://push2.eastmoney.com/api/qt/clist/get?cbjQuery11240282252222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222......的请求。右键复制为 cURL粘贴到文本编辑器中提取关键参数curl https://push2.eastmoney.com/api/qt/clist/get \ -H Referer: https://guba.eastmoney.com/ \ -H User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 \ --data-raw fidf_600519po1pz50pn1np1fltt2invt2utb2884a3937924ae5952b4e6f1d651c2acbjQuery11240282252222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222............ \ --compressed提示fidf_600519是股票代码前缀pz50表示每页 50 条pn1是页码ut是固定密钥值为b2884a3937924ae5952b4e6f1d651c2a所有股吧请求共用cb是 jQuery 回调名服务端返回 JSONP 格式实际数据在cb(...)的括号内。2.2 还原push2接口的签名参数w和时间戳t观察 Network 中多个push2请求你会发现 URL 中还包含w和t参数例如w...t1712345678901。t是毫秒级时间戳但并非当前时间——它必须与服务器时间误差控制在 ±30 秒内否则返回{status:0,msg:非法请求}。w是一个 Base64 编码字符串解码后为形如{fid:f_600519,po:1,pz:50,pn:1,np:1,fltt:2,invt:2,ut:b2884a3937924ae5952b4e6f1d651c2a}的 JSON再经 MD5 加密后取前 16 位最后 Base64 编码。Python 实现如下import json import hashlib import base64 import time def generate_w_param(fid: str, pn: int 1, pz: int 50) - str: 生成 push2 接口 w 参数 payload { fid: fid, po: 1, pz: pz, pn: pn, np: 1, fltt: 2, invt: 2, ut: b2884a3937924ae5952b4e6f1d651c2a } # JSON 字符串化不带空格 json_str json.dumps(payload, separators(,, :)) # MD5 哈希 取前16位 md5_hash hashlib.md5(json_str.encode()).hexdigest()[:16] # Base64 编码 return base64.b64encode(md5_hash.encode()).decode() # 示例生成第1页参数 w_param generate_w_param(f_600519, pn1) t_param int(time.time() * 1000) # 毫秒时间戳 print(fw{w_param}t{t_param}) # 输出类似wMTIzNDU2Nzg5MGFiY2RlZgt17123456789012.2.1 为什么必须校准t参数——服务器时间同步实测方案直接使用time.time()在高并发或时区错配机器上会导致失败。可靠做法是先请求一次东方财富首页https://www.eastmoney.com从响应头Date字段提取 GMT 时间转换为本地毫秒时间戳import requests from datetime import datetime def get_server_timestamp(): 获取东方财富服务器时间毫秒 try: resp requests.get(https://www.eastmoney.com, timeout5) server_time_str resp.headers.get(Date) if server_time_str: # 解析 GMT 时间如 Mon, 01 Jan 2024 00:00:00 GMT dt datetime.strptime(server_time_str, %a, %d %b %Y %H:%M:%S %Z) return int(dt.timestamp() * 1000) except Exception as e: print(f获取服务器时间失败回退到本地时间: {e}) return int(time.time() * 1000) # 使用 t_param get_server_timestamp()2.3 构建可复用的push2请求函数并处理 JSONP 响应push2返回的是 JSONP 格式需剥离回调函数名。以下函数封装了完整请求逻辑包含重试、超时、User-Agent 轮换及 Referer 设置import requests import re import time import random def fetch_push2_data(fid: str, pn: int 1, pz: int 50, max_retries: int 3) - dict: 获取股吧列表数据 :param fid: 股吧标识如 f_600519 :param pn: 页码 :param pz: 每页数量 :param max_retries: 最大重试次数 :return: 解析后的 JSON 数据字典 headers { Referer: https://guba.eastmoney.com/, User-Agent: random.choice([ Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 ]) } params { fid: fid, po: 1, pz: pz, pn: pn, np: 1, fltt: 2, invt: 2, ut: b2884a3937924ae5952b4e6f1d651c2a, w: generate_w_param(fid, pn, pz), t: get_server_timestamp() } for attempt in range(max_retries): try: resp requests.get( https://push2.eastmoney.com/api/qt/clist/get, paramsparams, headersheaders, timeout10 ) resp.raise_for_status() # 处理 JSONP匹配 cb(....) 中的内容 content resp.text.strip() match re.search(rcb\((.*?)\);?$, content) if match: data json.loads(match.group(1)) if data.get(status) 1: return data else: raise ValueError(fAPI 返回错误: {data.get(msg, 未知错误)}) else: raise ValueError(未找到 JSONP 数据) except Exception as e: if attempt max_retries - 1: raise e time.sleep(1 random.uniform(0, 1)) # 指数退避 raise RuntimeError(请求失败已重试最大次数) # 测试调用 try: result fetch_push2_data(f_600519, pn1) print(f成功获取 {len(result.get(data, {}).get(diff, []))} 条帖子) except Exception as e: print(f请求失败: {e})注意fetch_push2_data返回的result[data][diff]是一个列表每个元素是一个帖子对象包含f12股票代码、f13市场代码、f14标题、f20作者昵称、f21发帖时间戳、f23阅读数、f24评论数、f31点赞数等字段。其中f21是毫秒时间戳需转换为可读时间datetime.fromtimestamp(f21 / 1000)。3. 从原始帖子列表中提取正文内容绕过懒加载与动态评论接口3.1 股吧帖子详情页结构分析与反爬特征识别push2接口只返回帖子摘要标题、作者、时间、热度不包含正文和评论。要获取正文需访问单个帖子详情页URL 形如https://guba.eastmoney.com/news,600519,123456789.html。但该页面同样采用 SPA 架构正文由https://push2.eastmoney.com/api/qt/stockpage/get接口异步加载且该接口要求携带cookie含em_hq和em_hq_v2及Referer。更关键的是该接口对cookie中的em_hq_v2值有强校验——它由用户登录态生成未登录用户无法直接构造。3.1.1 无需登录的替代方案利用push2的content字段与news接口组合观察大量帖子发现部分热门帖的push2返回数据中f14标题字段后紧随f15字段其值为 HTML 片段含p、br标签即帖子正文的简化版。但f15并非总存在。更稳定的做法是从push2结果中提取f12股票代码和f13市场代码拼接出news接口 URL# 从 push2 返回的 diff 列表中提取一条 post result[data][diff][0] stock_code post[f12] # 如 600519 market_code post[f13] # 如 1 表示沪市 post_id post[f11] # 帖子唯一ID如 123456789 # 构造 news 接口 URL news_url fhttps://push2.eastmoney.com/api/qt/stockpage/get?cbsecid{market_code}.{stock_code}type1force1callbackjQuery1124028225222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...... p a hrefhttps://download.csdn.net/download/s44359487yad/90587692 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p