尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

东方财富网股票数据爬取实战:从接口分析到数据存储

东方财富网股票数据爬取实战:从接口分析到数据存储 东方财富网股票数据爬取实战从接口分析到数据存储在金融数据分析领域获取准确、全面的股票基础数据是开展后续分析的前提。本文将详细介绍如何通过Python爬取东方财富网的A股相关数据涵盖接口分析、数据解析、循环爬取及CSV文件存储全流程帮助读者掌握金融数据爬取的核心思路与实现方法。一、技术选型与前期准备1. 核心库说明本次爬取任务主要依赖以下Python库requests发送HTTP请求获取网页/接口数据re正则表达式处理清洗接口返回的非标准JSON数据pandas数据结构化存储与CSV文件读写。2. 环境配置确保已安装对应依赖库执行以下命令pip install requests pandas二、接口分析与请求构造1. 目标接口定位东方财富网的股票列表数据通过接口返回核心接口格式如下https://7.push2.eastmoney.com/api/qt/clist/get? cbjQueryxxxpn{页码}pz20po1np1utxxxfltt2invt2wbp2uxxxfid{分类参数}fields{字段参数}_时间戳关键参数说明pn页码控制分页爬取pz每页条数示例中设为20fid股票分类标识如沪深京A股、创业板等fields需要获取的字段如代码f12、名称f14、最新价f2等。2. 请求头配置为模拟浏览器请求避免被反爬需配置User-Agent和CookieCookie可从浏览器开发者工具中获取header{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,Cookie:qgqp_b_idxxx; websitepoptg_api_timexxx; ...}三、核心代码实现1. 定义股票分类参数首先定义需要爬取的股票分类及对应的fid参数便于循环爬取aa{沪深京A股:f3fsm:0t:6,m:0t:80,m:1t:2,m:1t:23,m:0t:81s:2048,上证A股:f3fsm:1t:2,m:1t:23,深证A股:f3fsm:0t:6,m:0t:80,北证A股:f3fsm:0t:81s:2048,新股:f26fsm:0f:8,m:1f:8,创业板:f3fsm:0t:80,科创板:f3fsm:1t:23,沪股通:f26fsb:BK0707,深股通:f26fsb:BK0804,B股:f3fsm:0t:7,m:1t:3,风险警示板:f3fsm:0f:4,m:1f:4,}2. 接口数据获取函数封装get_html函数负责发送请求、清洗数据并返回结构化字典defget_html(aa,page):# 构造完整请求URLurlfhttps://7.push2.eastmoney.com/api/qt/clist/get?\fcbjQuery112409467675731682619_1703939377395pn{page}pz20po1np1\futbd1d9ddb04089700cf9c27f6f7426281fltt2invt2wbp2u|0|0|0|webfid{aa}fieldsf1,\ff2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,\ff20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152_1703939377396# 发送GET请求responserequests.get(url,headersheader).text# 清洗jQuery包裹的非标准JSON数据left_datare.search(r^.*?(?\(),response).group()datare.sub(left_data\(,,response)datare.sub(\);,,data)# 转换为Python字典dataeval(data)returndata3. 循环爬取所有分类数据遍历所有股票分类分页爬取数据并整合到总DataFrame中# 初始化总数据容器all_dfpd.DataFrame(columns[代码,名称,最新价,开盘价,收盘价])nullnullforcategoryinaa.keys():page0whileTrue:page1dataget_html(aa[category],page)# 数据非空则解析存储ifdata[data]!null:print(f正在爬取{category}第{page}页)dfdata[data][diff]forindexindf:all_dfall_df.append({代码:index[f12],名称:index[f14],最新价:index[f2],开盘价:index[f17],收盘价:index[f18]},ignore_indexTrue)else:# 数据为空则结束该分类爬取break4. 数据存储与预览将爬取的总数据保存为CSV文件并读取预览前50行# 保存为CSV文件解决中文乱码用gb18030编码all_df.to_csv(股票数据.csv,indexFalse,encodinggb18030)# 读取CSV文件all_dfpd.read_csv(股票数据.csv,encodinggb18030)# 预览数据print(前50行数据)print(all_df.head(50))四、关键问题与优化思路1. 数据清洗关键点接口返回的是jQuery包裹的JSON数据需通过正则去掉前缀jQueryxxx(和后缀);再用eval转换为字典也可改用json.loads提升安全性。2. 反爬策略应对配置真实的User-Agent和Cookie模拟浏览器行为可添加请求延时time.sleep(1)避免高频请求被封IP分页爬取时设置合理的每页条数避免单次请求数据量过大。3. 性能优化替换DataFrame.append为列表存储后批量转换append效率低# 优化方案先存列表再转DataFramedata_list[]forindexindf:data_list.append({代码:index[f12],名称:index[f14],最新价:index[f2],开盘价:index[f17],收盘价:index[f18]})all_dfpd.DataFrame(data_list)多线程/多进程爬取需控制并发数提升爬取效率。4. 异常处理添加try-except捕获请求异常如网络中断、接口返回异常避免程序崩溃defget_html(aa,page):try:responserequests.get(url,headersheader,timeout10).text# 后续清洗逻辑exceptExceptionase:print(f第{page}页请求失败{e})return{data:null}五、总结本文通过实战案例讲解了东方财富网股票数据的爬取流程核心在于接口参数分析、非标准JSON数据清洗、分页循环爬取及Pandas数据处理。该思路可扩展到其他金融数据爬取场景同时需注意遵守网站robots协议合理合规获取数据。
返回列表