建设淘宝网站的人员组织结构,河南多用户商城开发,软件详细设计文档,网络规划设计师2022论文5月引言#xff1a; 这是沪深 300 股票爬虫系列的上篇#xff0c;核心目标是帮零基础小白快速上手 —— 用 Python 爬取沪深 300 成分股的当天实时数据#xff08;包括最新价、涨跌幅、成交量等 16 个关键指标#xff09;#xff0c;最终导出为 Excel 文件#xff0c;直接可…引言这是沪深 300 股票爬虫系列的上篇核心目标是帮零基础小白快速上手 —— 用 Python 爬取沪深 300 成分股的当天实时数据包括最新价、涨跌幅、成交量等 16 个关键指标最终导出为 Excel 文件直接可用。系列文章分工明确避免一次性信息过载上篇本文聚焦「当天实时数据」掌握 GET 请求、JSONP 解析、多页循环爬取 核心技能下篇进阶「往期历史数据」解锁 POST 负载构造、时间戳转换。一、前置准备打开电脑终端Windows 按WinR输cmdMac 打开终端复制以下命令执行安装爬取和数据处理必需的库pip install requests pandas openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple/requests负责发送网络请求相当于 “模拟浏览器访问网页”是爬数据的核心pandas把爬来的杂乱数据整理成表格方便导出 Excelopenpyxl支持 Excel 文件写入避免导出时报错。沪深 300 是 A 股核心指数包含 300 只优质股票如贵州茅台、宁德时代。我们要爬的是「当天实时行情数据」最终拿到的 Excel 会包含这些关键指标代码、名称、最新价、涨跌幅、涨跌额、成交量、成交额、振幅、最高价、最低价、今开、昨收、量比、换手率、市盈率、市净率共 16 项满足日常看盘需求。二、核心原理我们爬取的是东方财富网的接口数据不是网页 HTML效率更高、解析更简单接口类型GET请求参数直接拼在 URL 里小白易理解数据格式JSONP本质是 “JSON 数据 函数包裹”目的是跨域请求我们只需用正则去掉外层 “壳”就能拿到纯 JSON 数据多页爬取接口用pn1第 1 页、pn2第 2 页控制页码每页 20 条数据循环 1-15 页即可爬完 300 只股票。三、分步实操1.抓包找接口打开 Chrome 浏览器访问东方财富网沪深 300 板块随便搜 “东方财富 沪深 300 成分股”按F12打开「开发者工具」切换到「Network网络」选项卡刷新页面在搜索框输入get?cbjQuery找到名称带clist/get的请求这就是我们要的数据源接口点击该请求查看「Headers请求头」→「Request URL」这是完整接口 URL和「Request Headers」里面的User-Agent和Cookie要复制到代码里避免被反爬。2.解析 JSONP 数据jQuery112405058079421913007_1702096593951({data:{diff:[{f12:600519,f14:贵州茅台,f2:1800.00,...}]}});问题这不是纯 JSON外面包了jQueryxxx(...)和末尾的;无法直接解析解决用正则表达式提取(和)之间的内容再去掉末尾的;就能得到纯 JSON。正则核心代码:import re # content1是接口返回的原始数据 pattern rjQuery\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()导出indexFalse表示不保存默认索引。四、完整代码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 fhttp://4.push2.eastmoney.com/api/qt/clist/get?cbjQuery112405058079421913007_1702096593951pn{page}pz20po1np1utbd1d9ddb04089700cf9c27f6f7426281fltt2invt2wbp2u|0|0|0|webfidf3fsb:BK0500f:!50fieldsf1,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_iddfc29624f92cdad68210e05891a19e24; st_si53708276698179; websitepoptg_show_time1701908501838; st_asidelete; HAListty-1-000300-%u6CAA%u6DF1300%2Cty-1-000001-%u4E0A%u8BC1%u6307%u6570%2Cty-0-300059-%u4E1C%u65B9%u8D22%u5BCC; st_pvi57866953581055; st_sp2023-12-07%2008%3A21%3A41; st_inirUrlhttps%3A%2F%2Fwww.baidu.com%2Flink; st_sn24; st_psi20231209123634486-113200301321-2633832308 } res requests.get(url, headersheaders) content1 res.text pattern rjQuery112405058079421913007_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, indexFalse)五、小白必看1. 替换User-Agent和Cookie原代码中的User-Agent和Cookie是旧的可能已失效。按以下步骤获取自己的按前面 “抓包找接口” 的步骤找到目标请求点击「Headers」→ 下拉找到「Request Headers」复制User-Agent和Cookie的完整内容替换代码中对应位置的内容。2. 时间戳自动生成原代码中_1702096593985是固定时间戳可能过期。优化后的代码用int(time.time() * 1000)生成当前毫秒级时间戳每次运行自动更新避免失效。注其实吧这个只是有些网站有这些要求而今天的目标网站不用在意这些细节但这个又是比较教科书式的说法~六、总结GET请求参数拼在 URL 里适合简单数据请求如当天行情JSONP解析用正则去掉jQuery(...)外层壳拿到纯 JSON 数据多页爬取通过pn页码动态切换页面循环实现批量爬取反爬技巧带全headers伪装浏览器 随机延时避免高频请求数据存储用pandas快速整理数据并导出 Excel实用高效。通过上篇你已经掌握了 “爬取当天实时股票数据” 的完整流程但如果想做趋势分析比如看某只股票近 30 天的涨跌、策略回测就需要历史数据 —— 这正是下篇要讲的核心内容。下篇预告解锁POST请求、负载Payload构造、时间戳转换教你爬取任意时间段的沪深 300 历史数据让爬虫能力再上一个台阶如果运行代码时遇到问题欢迎在评论区留言我会逐一解答 关注我下篇不见不散