ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python爬虫实战:同花顺股票数据采集与量化分析

Python爬虫实战:同花顺股票数据采集与量化分析 1. 项目概述Python爬取同花顺股票数据的技术实现去年帮私募朋友做量化策略时需要批量获取技术指标数据。传统手工导出效率太低最终用Python实现了自动化采集方案。这个项目核心是通过爬虫技术从同花顺获取结构化股票数据并提取MACD、KDJ等关键指标为量化分析提供数据支持。同花顺作为主流金融数据平台其网页版包含丰富的技术指标数据但缺乏批量导出功能。通过分析页面请求我们发现其数据接口采用Ajax动态加载需要模拟浏览器行为才能获取完整数据。本文将详解从环境搭建到指标提取的全流程实现包含三个关键阶段数据采集层请求模拟与反爬绕过、数据处理层字段清洗与计算、数据应用层指标可视化与策略回测。提示本项目仅用于技术学习实际使用需遵守同花顺的用户协议。高频访问可能导致IP被封禁建议控制请求频率在5秒/次以上。2. 技术方案设计与环境准备2.1 核心工具选型经过对比测试最终技术栈组合如下请求库Requests selenium主备双方案Requests处理静态接口效率高selenium应对动态渲染兼容性好解析库BeautifulSoup4 pyqueryBS4用于HTML结构解析pyquery处理类jQuery选择器数据处理pandas TA-Libpandas进行数据清洗TA-Lib计算专业指标反爬方案随机UserAgent 代理IP池# 基础依赖安装 pip install requests selenium beautifulsoup4 pyquery pandas pip install TA-Lib # 需先安装Windows版二进制包2.2 同花顺接口分析通过Chrome开发者工具F12分析网络请求发现关键数据接口实时行情https://data.10jqka.com.cn/历史K线https://d.10jqka.com.cn/v2/line/指标数据https://basic.10jqka.com.cn/接口特点需要携带Referer和Cookie鉴权分页参数采用page和size控制返回数据为JSON格式需处理Unicode编码3. 核心爬取流程实现3.1 请求头模拟实战成功请求的关键在于头部信息配置。通过实际抓包我们整理出必须包含的字段headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Referer: https://stock.10jqka.com.cn/, Cookie: vxxxxxx;, # 需登录后获取 X-Requested-With: XMLHttpRequest }实测发现同花顺对以下特征进行检测缺少Referer直接返回403非常规UserAgent会触发验证码单IP高频访问会限流建议配合代理3.2 数据解析与清洗获取到的原始数据需要多层处理HTML解编码处理#x开头的Unicode字符字段提取用CSS选择器定位关键元素类型转换字符串转数值/日期类型def parse_stock_data(html): soup BeautifulSoup(html, lxml) data [] for tr in soup.select(tbody tr): item { code: tr.select_one(.stockCode).text, name: tr.select_one(.stockName).text, price: float(tr.select_one(.price).text), change: tr.select_one(.change).text } data.append(item) return pd.DataFrame(data)3.3 技术指标计算方案使用TA-Lib库计算专业指标时需注意参数设置指标类型函数名典型参数计算要点MACDtalib.MACDfastperiod12需输入close价格序列KDJtalib.STOCH[9,3,3]需要high/low/closeRSItalib.RSItimeperiod14单价格序列输入BOLLtalib.BBANDS20返回上中下三条轨道线踩坑记录TA-Lib要求输入值为numpy数组需提前用df[close].values转换4. 完整实现代码解析4.1 主爬虫类设计class ThsSpider: def __init__(self): self.session requests.Session() self.session.headers.update(base_headers) def get_stock_list(self, page1): url fhttps://data.10jqka.com.cn/financial/yjyg/order/desc/page/{page}/ try: resp self.session.get(url, timeout10) resp.raise_for_status() return self.parse_list(resp.text) except Exception as e: print(f请求失败: {str(e)}) return None def parse_list(self, html): # 实现解析逻辑 pass4.2 数据持久化方案推荐两种存储方式CSV文件适合小型数据集df.to_csv(stock_data.csv, indexFalse, encodingutf_8_sig)MySQL数据库推荐生产环境使用from sqlalchemy import create_engine engine create_engine(mysql://user:passhost/db) df.to_sql(stock_data, engine, if_existsappend)4.3 定时任务配置使用APScheduler实现自动化采集from apscheduler.schedulers.blocking import BlockingScheduler sched BlockingScheduler() sched.scheduled_job(cron, hour15, minute30) # 收盘后运行 def daily_job(): spider ThsSpider() spider.get_stock_list() sched.start()5. 常见问题与优化方案5.1 反爬应对策略根据实测经验整理的反爬解决方案现象解决方案实现示例返回验证码降低频率更换UAheaders[User-Agent] random.choice(ua_list)IP被封禁使用代理IP轮询proxies {https: http://ip:port}数据加载不全改用selenium渲染driver.execute_script(window.scrollTo(0, document.body.scrollHeight))接口返回空数据检查Cookie有效期重新登录更新Cookie5.2 性能优化技巧异步请求加速改用aiohttp实现并发async with aiohttp.ClientSession() as session: async with session.get(url) as resp: return await resp.text()缓存复用机制对基础数据本地缓存增量采集策略记录最后更新时间戳5.3 数据质量校验建议增加的校验规则def validate_data(df): # 检查空值率 if df.isnull().mean().max() 0.3: raise ValueError(数据缺失严重) # 检查价格合理性 if (df[price] 0).any(): raise ValueError(存在异常价格)6. 技术指标应用实例6.1 MACD策略信号生成def generate_signals(df): df[macd], df[signal], _ talib.MACD(df[close]) df[position] np.where(df[macd] df[signal], 1, -1) return df6.2 可视化分析使用matplotlib绘制指标曲线plt.figure(figsize(12,6)) plt.plot(df[date], df[close], labelClose) plt.plot(df[date], df[upper], r--, labelUpper Band) plt.legend() plt.show()在项目落地过程中发现同花顺的移动平均线计算方式与TA-Lib存在差异。经过比对确认是同花顺使用了前复权价格计算而我们的原始数据未复权。解决方案是在计算前先对价格序列进行复权处理保证指标一致性。
返回列表