无报错但无法获取网站股票JSON数据,请求技术协助
问题:无法获取Marketsmithindia网站红框内股票数据,代码无输出
我尝试获取Marketsmithindia网站截图红框内的股票数据,但编写的Python代码运行后无输出,希望能协助获取该红框中的数据。
相关信息
目标数据截图

网站地址
https://marketsmithindia.com/mstool/eval/tvssrichak/evaluation.jsp#/
测试用JSON接口链接
https://msi-gcloud-prod.appspot.com/gateway/simple-api/ms-india/instr/0/3023210/symboldetails.json?s=20180719&e=20230719&text=TVSSRICHAK&lang=en&isConsolidated=0&ms-auth=3990+MarketSmithINDUID-Web0000000000+MarketSmithINDUID-Web0000000000+0+230325200706+-514613229
Stocklist.txt内容
TVSSRICHAK INFY SUZLON
编写的Python代码
# -*- coding: utf-8 -*- """ Created on Sat Dec 24 23:14:57 2022 @author: eruku """ import requests infile = 'c:/Users/eruku/Documents/StocksList.txt' outfile = 'c:/Users/eruku/Documents/Marketsmithindia.txt' timeout = 10 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) ' 'Gecko/20100101 Firefox/73.0' } baseurl = 'https://msi-gcloud-prod.appspot.com/gateway/simple-api/ms-india/instr/0/3023210/symboldetails.json?s=20180719&e=20230719&text=' endurl = '&lang=en&isConsolidated=0&ms-auth=3990+MarketSmithINDUID-Web0000000000+MarketSmithINDUID-Web0000000000+0+230325200706+-514613229' session = requests.Session() response = session.get(baseurl, headers=headers, timeout=timeout) with open(infile, 'r') as IN, open(outfile, 'w') as OUT: for stock in IN: stock = stock.strip() response = session.get( # f'{baseurl}api/quote-equity?symbol={stock}', f'{baseurl}{stock}{endurl}', headers=headers, timeout=timeout ) response = response.json()
问题分析与修复方案
1. 代码无输出的核心原因
代码仅完成了接口请求和JSON解析,但未将解析后的数据写入输出文件或打印,所以运行后无输出。此外还存在两个潜在问题:
- 提前发起了一次无效的
baseurl请求(不带股票代码),可能触发接口限制 - 未处理请求失败的异常情况(网络错误、接口返回非JSON数据等)
2. 修复后的代码
以下代码添加了数据写入、错误处理,并优化了请求逻辑:
# -*- coding: utf-8 -*- import requests import json infile = 'c:/Users/eruku/Documents/StocksList.txt' outfile = 'c:/Users/eruku/Documents/Marketsmithindia.txt' timeout = 10 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0' } baseurl = 'https://msi-gcloud-prod.appspot.com/gateway/simple-api/ms-india/instr/0/3023210/symboldetails.json' session = requests.Session() with open(infile, 'r') as IN, open(outfile, 'w', encoding='utf-8') as OUT: for stock in IN: stock = stock.strip() if not stock: continue # 用参数字典构建请求,避免URL拼接出错 params = { 's': '20180719', 'e': '20230719', 'text': stock, 'lang': 'en', 'isConsolidated': '0', 'ms-auth': '3990+MarketSmithINDUID-Web0000000000+MarketSmithINDUID-Web0000000000+0+230325200706+-514613229' } try: response = session.get(baseurl, headers=headers, params=params, timeout=timeout) response.raise_for_status() # 触发HTTP错误异常 data = response.json() # 提取红框内目标数据(需根据接口实际返回的JSON结构调整字段) # 示例:假设红框包含营收增长率、净利润率等指标,替换为实际字段名 target_data = { '股票代码': stock, '营收增长率(3年)': data.get('threeYearSalesGrowth', '无数据'), '净利润率': data.get('netProfitMargin', '无数据'), 'ROE': data.get('roe', '无数据') } # 将数据写入文件,每行一个格式化JSON对象 OUT.write(json.dumps(target_data, ensure_ascii=False) + '\n') print(f"已获取并写入{stock}的数据") except requests.exceptions.RequestException as e: error_msg = f"{stock}请求失败: {str(e)}" OUT.write(error_msg + '\n') print(error_msg) except ValueError: error_msg = f"{stock}返回非JSON格式数据" OUT.write(error_msg + '\n') print(error_msg)
3. 关键注意事项
- ms-auth参数有效性:该参数是网站身份验证凭证,可能过期或与浏览器会话绑定。如果请求返回401/403错误,需登录Marketsmithindia后,从浏览器开发者工具的网络请求中复制最新的
ms-auth参数替换代码中的对应值。 - 目标字段匹配:需要先打印
data查看接口返回的完整JSON结构,再调整target_data中的字段,精准匹配截图红框内的具体指标。
内容的提问来源于stack exchange,提问作者erukumk
相关产品推荐
相关产品推荐

