前言
同花顺是国内最受欢迎的金融数据平台之一,其”问财”和行情中心提供了全面的A股、港股、美股等市场数据。对于量化交易爱好者、金融数据分析师来说,能够自动化获取这些数据是非常有价值的技能。
然而,同花顺对爬虫有较为严格的反爬虫措施:其关键API需要在Cookie中携带一个由JavaScript动态生成的 v 参数。本文将深入讲解如何使用 PyExecJS 在Python中执行同花顺的混淆JS代码,获取合法的 v 值,从而成功爬取股票行情数据。
技术背景
本项目涉及以下核心技术和库:
- requests:发送HTTP请求,获取股票行情页面数据
- execjs(PyExecJS):在Python中执行JavaScript代码,生成反爬虫所需的Cookie参数
- parsel:轻量级的HTML/XML解析库,语法类似Scrapy的选择器
- csv:将股票数据写入CSV文件,方便后续用Excel或pandas分析
- prettytable:在终端以表格形式展示股票数据
- random:随机选取User-Agent,降低被识别为爬虫的概率
同花顺的反爬虫机制:
同花顺在Cookie中设置了一个 v 字段,其值由一个经过重度混淆的JavaScript函数生成。每次请求需要在Cookie中携带这个 v 值,否则服务器会返回空数据或拒绝访问。
实现思路
同花顺股票数据爬虫的整体流程如下:
1 | ┌─────────────────────────────────────────────┐ |
URL结构说明:https://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/{page}/ajax/1/
board/all:所有板块(也可指定为沪市、深市等)field/zdf:按涨跌幅排序order/desc:降序排列page/{page}:第几页ajax/1:AJAX请求(返回HTML片段而非完整页面)
核心代码解析
1. JavaScript混淆与v参数生成
同花顺的JS混淆文件(同花顺.js)经过多重混淆,但直接用 execjs 执行即可获取 v 值,无需深入理解混淆逻辑。
1 | // 同花顺.js 关键结构(极度简化版) |
在Python中执行这段JS:
1 | import execjs |
execjs 的使用要点:
execjs.compile(js_string):编译JS代码,返回可执行对象js_code.call('function_name', *args):调用JS中的全局函数- 如果JS代码中有浏览器特有的全局对象(如
document、window、navigator),需要在JS文件中补充mock定义(本项目JS文件开头已经有了)
1 | // 同花顺.js 开头的浏览器环境mock |
2. 构造Cookie并发送请求
1 | import csv |
3. 使用parsel解析HTML表格
同花顺返回的是HTML片段(AJAX请求),包含一个 .m-table 表格。使用 parsel 可以非常方便地提取表格数据:
1 | # 使用parsel选择器解析网页内容 |
parsel选择器语法:
css('.m-table tr'):选取所有class为m-table下的tr元素css('td::text'):获取td元素的文本内容(::text是parsel伪元素)css('td a::text'):获取td下a标签的文本内容getall():返回所有匹配结果的列表get():返回第一个匹配结果(字符串)
4. 使用PrettyTable美化终端输出
在爬取过程中,可以用 PrettyTable 实时展示数据:
1 | from prettytable import PrettyTable |
5. 优化版:增加随机User-Agent
基础版使用固定的User-Agent,优化版使用随机User-Agent列表:
1 | import random |
6. 完整代码汇总
1 | import csv |
运行效果
1 | 正在采集第1页... |
生成的CSV文件内容预览:
| 代码 | 名称 | 现价 | 涨跌幅(%) | 涨跌 | 换手(%) | 成交额 | 市盈率 |
|---|---|---|---|---|---|---|---|
| 600000 | 浦发银行 | 8.52 | 1.23 | 0.10 | 0.23 | 1.2亿 | 4.5 |
| 600016 | 民生银行 | 3.89 | 0.78 | 0.03 | 0.15 | 0.8亿 | 3.2 |
总结与优化方向
通过本文的同花顺股票数据爬虫项目,我们学习了:
- JS混淆对抗:使用
execjs在Python中执行混淆JS,获取动态Cookie参数 - parsel解析:轻量级HTML解析,语法简洁高效
- 大规模数据采集:循环翻页,支持爬取全市场股票数据
- 数据持久化:CSV格式保存,方便后续用pandas/Excel分析
- 反爬虫基础:随机User-Agent、Cookie携带
可优化方向:
- v值缓存:
v值有一定有效期,不需要每页都重新生成,可以缓存复用 - 失败重试:某一页请求失败时自动重试3次
- 使用Session:用
requests.Session()保持会话,提升效率 - 数据存储升级:改用SQLite或MySQL存储,支持增量更新和去重
- 定时任务:结合
crontab或schedule库,每天自动爬取最新数据 - 数据可视化:用
matplotlib或echarts绘制涨跌幅分布图、市盈率散点图等 - 多平台对比:同时爬取东方财富、新浪财经等平台,做数据交叉验证
- 代理IP池:大规模爬取时使用代理IP,避免被限流
免责声明:本项目仅供学习交流使用。同花顺网站的数据版权归同花顺公司所有,请勿将爬取的数据用于商业目的。使用本代码产生的任何后果由使用者自行承担。