ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

pywencai 完整教程:用 Python 抓取同花顺问财数据,3 步拿到 DataFrame

2026/8/24 23:56:49 拓冰建站 浏览量
pywencai 完整教程:用 Python 抓取同花顺问财数据,3 步拿到 DataFrame pywencai 完整教程用 Python 抓取同花顺问财数据3 步拿到 DataFrame【免费下载链接】pywencai获取同花顺问财数据项目地址: https://gitcode.com/gh_mirrors/py/pywencaipywencai 是一个用于获取同花顺问财数据的 Python 库。它把自然语言查询如市盈率30 且 股息率2%发到问财后台接口直接把结果转成 pandas DataFrame适合量化研究、股票池构建、风险监控等场景。整个库只有一个核心入口pywencai.get理解了请求链路三步就能跑起来。从手敲查询语句到一行代码痛点在哪做过量化回测的人都熟悉这个循环打开问财网页、敲入查询、等结果、把表格手动复制到 Excel、清洗格式再喂给 pandas。条件组合越复杂这套复制粘贴越机械而且结果无法被脚本复现。pywencai 把这段流程封进 Python你只需要写进搜索框的那句自然语言查询请求、签名、分页、格式转换它都做了返回值直接是一个 DataFrame。有两个前置条件要注意由于问财调整了登录策略cookie现在是必填参数库内部要执行一段生成 token 的脚本所以机器上必须装 Node.js v16。跟着两次请求走拆解问财数据链路先看整体链路关键点一hexin-vtoken。问财的反爬 token 不是固定值pywencai 每次请求都用子进程调起 Node.js 执行打包好的hexin-v.bundle.js把它的标准输出当作请求头里的 token。这就是 Node.js 是硬依赖的原因def get_token(): 获取token result subprocess.run( [node, os.path.join(os.path.dirname(__file__), hexin-v.bundle.js)], stdoutsubprocess.PIPE, ) return result.stdout.decode().strip()执行后拿到的就是一串字符串 token库直接把它作为hexin-v请求头的值源码在pywencai/headers.py。同时该模块用fake_useragent随机生成 User-Agent避免固定 UA 被指纹化再加上你传入的 cookie凑成完整请求头。关键点二入口函数本身只是分发器。pywencai/wencai.py的核心不到 10 行def get(loopFalse, **kwargs): 获取结果 kwargs {replace_key(key): value for key, value in kwargs.items()} params get_robot_data(**kwargs) condition _.get(params.get(data), condition) if condition is not None: if loop and kwargs.get(find) is None: return loop_page(loop, params[row_count], params[url_params], **kwargs) return get_page(params[url_params], **kwargs) return params.get(data)它做了三件事①replace_key把友好参数sort_key/sort_order映射成接口字段urp_sort_index/urp_sort_way②get_robot_data发出请求一POSTwww.iwencai.com/customized/chart/get-robot-data问财把自然语言查询翻译成查询条件condition和一个取数地址③ 若 condition 存在就发请求二POSTwww.iwencai.com/gateway/urp/v7/landing/getDataList按页取回表格数据并转成 DataFrame若不存在说明查询的是详情类问题如茅台近三个月市盈率此时直接返回问财给的字典里面可能混着文本和 DataFrame。取数地址藏在请求一返回的 components 里pywencai/convert.py会取出结果表格组件底部的 footer URL再用parse_url_params把查询串解析成字典——这些参数就是请求二的钥匙配合页码和每页条数取数。所以第一步不能省直接调 getDataList 是拿不到数据的。上图是 cookie 的获取方式在问财网页打开浏览器开发者工具找到get-robot-data这条请求复制请求头里Cookie字段的完整内容。这个值会过期批量请求突然返回大量None时优先怀疑 cookie 失效。跑通 3 个实战任务选股、跨市场、盯具体标的先准备环境。安装库同时确认本机已装 Node.js v16pip install pywencai装好后在任何 Python 脚本里import pywencai即可。想读源码可以克隆仓库源码都在pywencai/目录下git clone https://gitcode.com/gh_mirrors/py/pywencai克隆下来可以直接打开pywencai/wencai.py对照上一节的链路核对。1. 用多维财务条件构建股票池需求按低估值 稳定分红的口径筛出一批股票按总市值排序输出且要拿全可能跨多页。import pywencai res pywencai.get( query市盈率30 and 股息率2% and 总市值200亿, sort_key总市值, sort_orderdesc, loopTrue, cookie替换成你的cookie, ) print(res.shape) print(res.head())输出效果loopTrue会按问财返回的row_count自动算页数每页 100 条循环到最后一页输出是一个 DataFrame每行一只股票列就是查询里出现的指标可以接着res[res[股息率] 3]继续过滤。容易踩的坑sort_key必须写成返回结果里真实存在的列名写错列名排序不会生效查询语句得是问财认识的自然语言条件写错时问财返回空结果pywencai 会重试 10 次后给你None。2. 用 query_type 查港股、基金等其他市场需求恒生指数成分股名单和 A 股数据做对比。hk pywencai.get( query恒生指数成分股, query_typehkstock, loopTrue, cookiexxx, )输出效果返回值同样是 DataFrame只需切换query_type。常用取值stock默认、hkstock港股、usstock美股、fund基金、zhishu指数、conbond可转债、futures期货等。容易踩的坑不传query_type时问财默认按 A 股理解你的问题查港股就会拿到空结果或张冠李戴的列。3. 用 find 把指定个股排到结果最前需求固定盯一个股票池600519 贵州茅台、000001 平安银行不管按什么条件排序结果里这两只永远在最前面。res pywencai.get( query今日成交额前100的A股, find[600519, 000001], cookiexxx, )输出效果find里指定的个体会出现在 DataFrame 最前面几行。实现上传了find后 pywencai 改走另一条接口unified-wap/v2/stock-pick/findJSON 取数路径也不同。容易踩的坑设置find后loop会失效只返回前 100 条而且这个参数只在查询结果是 DataFrame 时有效对详情类查询不起作用。顺带一提详情类查询返回的是字典而不是 DataFrame如果你希望类型始终是 DataFrame 或 None传no_detailTrue统一掉。重试、限频、缓存源码里值得照抄的三个做法重试兜底所有请求都走while_do包装——抛异常就重试最多 10 次每次间隔sleep秒全部失败则向上返回None最终get返回Nonedef while_do(do, retry10, sleep0, logFalse): count 0 while count retry: time.sleep(sleep) try: return do() except: log and logger.warning(f{count1}次尝试失败) count 1 return None重试耗尽仍失败时整个请求静默返回 None把logTrue打开控制台能看到第N次尝试失败的告警方便定位是网络问题还是 cookie 失效。这套固定间隔重试简单直接网络不稳时你可以自己改成指数退避思路不用变。限频sleep参数就是给loop分页用的控制相邻两次翻页请求的间隔。建议批量翻页时设sleep1起步不要多线程并发打同一个 cookie——项目 README 明确建议低频使用、反对高频调用高频会被问财屏蔽。自建缓存pywencai 没有内置缓存但返回值是 DataFrame落盘很方便import os, time, hashlib import pywencai def wencai_cached(query, cache_dircache, max_age_days1, **kwargs): key hashlib.md5(query.encode()).hexdigest() path os.path.join(cache_dir, f{key}.pkl) os.makedirs(cache_dir, exist_okTrue) if os.path.exists(path) and time.time() - os.path.getmtime(path) max_age_days * 86400: import pandas as pd return pd.read_pickle(path) res pywencai.get(queryquery, **kwargs) if res is not None: res.to_pickle(path) return res效果同一个 query 在有效期内直接命中缓存既省请求次数也减少 cookie 暴露频率。它不能做什么合规、限频与数据质量红线合规pywencai 是社区开源项目非同花顺官方工具原理与网页登录取数一致。使用需遵守问财用户协议项目不赞成商用商用场景请自行评估法律风险。限频高频调用会触发问财屏蔽。retry默认 10 次是容错手段不是加速手段把间隔 1~2 秒、批量放低峰期当基线。cookie 会过期cookie 与登录态绑定失效后请求拿不到数据。需要定期校验更新且不要把 cookie 提交进代码仓库——它等价于你的登录凭证。接口会变动问财接口策略变化较频繁两个接口地址和 JSON 结构都是逆向得到的。README 的建议是遇到问题先升级库版本再排查。数据质量问财数据基于公开信息整理做研究前请以公告、财报等官方披露为准perpage上限 100、find只返回前 100 条别假设一次请求能覆盖全市场。返回类型不统一列表查询返回 DataFrame详情查询返回字典可能含文本。不要默认一切结果都能.loc用no_detailTrue统一类型。适合谁用以及接下来看什么需要低频抓问财数据做研究、盯盘监控的人pywencai 值得引入一个函数覆盖多市场自带重试和分页源码一个下午能读完。两个延伸方向接定时任务如 APScheduler生成每日股票池报表用 pandas 的to_parquet把每日结果沉淀成本地财务数据库。【免费下载链接】pywencai获取同花顺问财数据项目地址: https://gitcode.com/gh_mirrors/py/pywencai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考