当前位置: 首页 > news >正文

Python 爬虫实战:沪深 300 股票(上)—— 小白入门!爬取当天实时数据

引言:

这是沪深 300 股票爬虫系列的上篇,核心目标是帮零基础小白快速上手 —— 用 Python 爬取沪深 300 成分股的当天实时数据(包括最新价、涨跌幅、成交量等 16 个关键指标),最终导出为 Excel 文件,直接可用。

系列文章分工明确,避免一次性信息过载:
上篇(本文):聚焦「当天实时数据」,掌握 GET 请求、JSONP 解析、多页循环爬取 核心技能;
下篇:进阶「往期历史数据」,解锁 POST 负载构造、时间戳转换。

一、前置准备

打开电脑终端(Windows 按Win+R输cmd,Mac 打开终端),复制以下命令执行,安装爬取和数据处理必需的库:

pip install requests pandas openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple/

requests:负责发送网络请求,相当于 “模拟浏览器访问网页”,是爬数据的核心;
pandas:把爬来的杂乱数据整理成表格,方便导出 Excel;
openpyxl:支持 Excel 文件写入(避免导出时报错)。

沪深 300 是 A 股核心指数,包含 300 只优质股票(如贵州茅台、宁德时代)。我们要爬的是「当天实时行情数据」,最终拿到的 Excel 会包含这些关键指标:
代码、名称、最新价、涨跌幅、涨跌额、成交量、成交额、振幅、最高价、最低价、今开、昨收、量比、换手率、市盈率、市净率(共 16 项,满足日常看盘需求)。

二、核心原理

我们爬取的是东方财富网的接口数据(不是网页 HTML),效率更高、解析更简单:
接口类型:GET请求(参数直接拼在 URL 里,小白易理解);
数据格式:JSONP(本质是 “JSON 数据 + 函数包裹”,目的是跨域请求,我们只需用正则去掉外层 “壳”,就能拿到纯 JSON 数据);
多页爬取:接口用pn=1(第 1 页)、pn=2(第 2 页)控制页码,每页 20 条数据,循环 1-15 页即可爬完 300 只股票。

三、分步实操

1.抓包找接口

  1. 打开 Chrome 浏览器,访问东方财富网沪深 300 板块(随便搜 “东方财富 沪深 300 成分股”);
  2. F12打开「开发者工具」,切换到「Network(网络)」选项卡;
  3. 刷新页面,在搜索框输入get?cb=jQuery,找到名称带clist/get的请求(这就是我们要的数据源接口);
  4. 点击该请求,查看「Headers(请求头)」→「Request URL」(这是完整接口 URL)和「Request Headers」(里面的User-AgentCookie要复制到代码里,避免被反爬)。

2.解析 JSONP 数据

jQuery112405058079421913007_1702096593951({"data":{"diff":[{"f12":"600519","f14":"贵州茅台","f2":"1800.00",...}]}});

  • 问题:这不是纯 JSON,外面包了jQueryxxx(...)和末尾的;,无法直接解析;
  • 解决:用正则表达式提取()之间的内容,再去掉末尾的;,就能得到纯 JSON。

正则核心代码:

import re # content1是接口返回的原始数据 pattern = r'jQuery\d+_\d+\((.+?)\)' # 匹配jQuery开头的函数包裹 match = re.search(pattern, content1) if match: extracted_data = match.group(1) # 提取括号内的JSON clean_data = re.sub(r'}\);', '', extracted_data) # 去掉末尾的"});" json_data = json.loads(clean_data) # 转为JSON格式,可按key取值

3.循环爬取多页数据

接口每页 20 条数据,300 只股票需要爬 15 页(page从 1 到 15):

  • for page in range(1, 16)循环页码;
  • 把 URL 里的pn={page}设为动态变量,每次循环自动切换页码;
  • 每爬完一页休息 1-2 秒(避免请求太快被反爬,代码里已加随机延时)。

4.存储数据到 Excel

pandas把爬来的列表数据整理成 DataFrame(表格),再用to_excel()导出,index=False表示不保存默认索引。

四、完整代码

import requests import json import time import re import pandas as pd # 在循环之前定义所有的空列表 code_list = [] # 创建 代码空列表,存储股票代码,下同 name_list = [] # 股票名称 Last_Trade_list = [] # 股票最新价 Change_list = [] # 股票站跌额 Chg_list = [] # 股票涨跌幅 Volume_list = [] # 股票成交量 Turnover_list = [] # 股票成交额 PrevClose_list = [] # 昨日收盘价 Open_list = [] # 今日开盘价 highest_list = [] # 股票最高价 lowest_list = [] # 股票最低价 amplitude_list = [] # 股票振幅 QRR_list = [] # 量比 TOR_list = [] # 换手率 PE_list = [] # 市盈率 PA_list = [] # 市净率 # 遍历页码 for page in range(1, 16): print(f'===============================正在爬取第{page}页数据内容=======================================') url = f'http://4.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112405058079421913007_1702096593951&pn={page}&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid=f3&fs=b:BK0500+f:!50&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152,f45&_=1702096593985' headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.0.10191 SLBChan/105', 'Cookie': 'qgqp_b_id=dfc29624f92cdad68210e05891a19e24; st_si=53708276698179; websitepoptg_show_time=1701908501838; st_asi=delete; HAList=ty-1-000300-%u6CAA%u6DF1300%2Cty-1-000001-%u4E0A%u8BC1%u6307%u6570%2Cty-0-300059-%u4E1C%u65B9%u8D22%u5BCC; st_pvi=57866953581055; st_sp=2023-12-07%2008%3A21%3A41; st_inirUrl=https%3A%2F%2Fwww.baidu.com%2Flink; st_sn=24; st_psi=20231209123634486-113200301321-2633832308' } res = requests.get(url, headers=headers) content1 = res.text pattern = r'jQuery112405058079421913007_1702096593951\((.+?)\)' match = re.search(pattern, content1) if match: extracted_data = match.group(1) clean_data = re.sub(r'}\);', '', extracted_data) json1 = json.loads(clean_data) data = json1['data'] diff_data = data['diff'] for di in diff_data: # 将获取到的数据添加到相应的列表中 code_list.append(di['f12']) name_list.append(di['f14']) Chg_list.append(di['f3']) highest_list.append(di['f15']) Change_list.append(di['f4']) Last_Trade_list.append(di['f2']) PrevClose_list.append(di['f18']) lowest_list.append(di['f16']) Volume_list.append(di['f5']) Open_list.append(di['f17']) Turnover_list.append(di['f6']) amplitude_list.append(di['f7']) QRR_list.append(di['f10']) TOR_list.append(di['f8']) PE_list.append(di['f9']) PA_list.append(di['f23']) # time.sleep(1) print(f'第{page}页爬取成功!!!') # 创建数据字典 data = { '代码': code_list, '名称': name_list, '最新价/元': Last_Trade_list, '涨跌幅/%': Chg_list, '涨跌额/元': Change_list, '成交量/手': Volume_list, '成交额/万元': Turnover_list, '振幅/%': amplitude_list, '最高/元': highest_list, '最低/元': lowest_list, '今开/元': Open_list, '昨收/元': PrevClose_list, '量比': QRR_list, '换手率': TOR_list, '市盈率(动态)': PE_list, '市净率': PA_list } # 转换为 DataFrame 并保存为 Excel 文件 df = pd.DataFrame(data) df.to_excel(r"沪深300.xlsx", 'Sheet', index=False)

五、小白必看

1. 替换User-AgentCookie

原代码中的User-AgentCookie是旧的,可能已失效。按以下步骤获取自己的:

  1. 按前面 “抓包找接口” 的步骤,找到目标请求;
  2. 点击「Headers」→ 下拉找到「Request Headers」;
  3. 复制User-AgentCookie的完整内容,替换代码中对应位置的内容。
2. 时间戳自动生成

原代码中_=1702096593985是固定时间戳,可能过期。优化后的代码用int(time.time() * 1000)生成当前毫秒级时间戳,每次运行自动更新,避免失效。

注:其实吧,这个只是有些网站有这些要求,而今天的目标网站不用在意这些细节,但这个又是比较教科书式的说法~

六、总结

  1. GET请求:参数拼在 URL 里,适合简单数据请求(如当天行情);
  2. JSONP解析:用正则去掉jQuery(...)外层壳,拿到纯 JSON 数据;
  3. 多页爬取:通过pn=页码动态切换页面,循环实现批量爬取;
  4. 反爬技巧:带全headers(伪装浏览器)+ 随机延时(避免高频请求);
  5. 数据存储:用pandas快速整理数据并导出 Excel,实用高效。

通过上篇,你已经掌握了 “爬取当天实时股票数据” 的完整流程!但如果想做趋势分析(比如看某只股票近 30 天的涨跌)、策略回测,就需要历史数据 —— 这正是下篇要讲的核心内容。

下篇预告:解锁POST请求负载(Payload)构造时间戳转换,教你爬取任意时间段的沪深 300 历史数据,让爬虫能力再上一个台阶!

如果运行代码时遇到问题,欢迎在评论区留言,我会逐一解答~ 关注我,下篇不见不散!

http://www.cnnetsun.cn/news/95957.html

相关文章:

  • 我的mybatis-flex自定义查询为什么没有参数
  • 揭秘Dify混合检索缓存机制:为何缓存清理如此重要?
  • 计划赶不上变化?错!是计划“根本赶不上开工”
  • 应用冷启动优化
  • java_base_(接口篇)省流版
  • 实测主流科技查新网站:它们如何解决专利与项目查新的双重需求?
  • 【收藏必备】零基础入门AI Agent:概念、结构、方法与开发框架全解析
  • vue基于Springboot框架实现新能源汽车4s店销售管理系统
  • 开关频率可调的永磁同步电机svpwm发电仿真模型,可调稳定发电电压,负载,母线电容可调,可用于...
  • C语言高阶玩法:函数指针与回调函数实战指南,让你的代码拥有“灵魂”
  • 基于SpringBoot的校园二手书交易平台的设计与实现
  • 数据结构与算法--007三数之和(medium)
  • C++ 模板初阶:泛型编程的入门指南
  • 基于Java实现优雅关闭的规范化方案设计与实现
  • 时序数据战场巅峰对决:金仓数据库 VS InfluxDB深度解析
  • Windows任务管理器中CPU相关指标怎么看?
  • 【必藏】大模型入行晚了?现在就是黄金时机!小白到入门的完整路线
  • 系统思考与认知习惯
  • 速藏!2026年免费免版权音乐素材网站推荐!正规版权保障,商用无压力不侵权
  • 【数据分享】1951-2024年我国省市县三级逐日、逐月和逐年近地面气温数据(Shp/Excel格式)
  • 金融行业广告投放:在合规的赛道上,实现精准增长
  • 长安汽车11月销量28.3万辆,同比增长2.3%
  • 1688 商品详情接口深度解析:从百川签名突破到供应链数据重构
  • LobeChat心理情绪日记分析工具
  • 一文搞懂纸老虎-布隆过滤器
  • LobeChat周年庆感恩回馈活动
  • 运维系列数据库系列【仅供参考】:DM JOB作业的邮件发送
  • 当AI面临伦理投诉时,AI应用架构师该怎么办?这5个解决步骤
  • 主存编址是什么
  • Python 整合 Redis 哨兵(Sentinel)与集群(Cluster)实战指南