如何调试BSEIndia API变更并传递正确参数恢复Python数据抓取
调试BSEIndia API数据抓取方案
问题分析
原代码失效大概率是因为API的验证机制或参数要求更新,比如旧的User-Agent被拦截、参数名/取值调整,或者请求格式变更。
关键修改点
- 更新User-Agent:使用更现代的浏览器标识,避免被反爬拦截
- 补充请求头:添加来源页标识,模拟正常网页访问行为
- 增加异常捕获:避免因API返回非JSON格式或HTTP错误导致程序崩溃
- 校验响应字段:兼容可能的响应结构变更
修改后的代码
import requests import pandas as pd import numpy as np pdate = "20230721" # 起始日期 date = "20230724" # 结束日期 url = 'https://api.bseindia.com/BseIndiaAPI/api/AnnGetData/w' # 更新为现代浏览器请求头,模拟正常访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'application/json, text/plain, */*', 'Referer': 'https://www.bseindia.com/corporates/ann.html' } payload = { 'Pageno': 1, 'strCat': '-1', 'strPrevDate': pdate, 'strScrip': '', 'strSearch': 'P', 'strToDate': date, 'strType': 'C' } data = [] should_fetch_next_page = True while should_fetch_next_page: print(f"Fetching page {payload['Pageno']} ...") try: response = requests.get(url, headers=headers, params=payload, timeout=10) response.raise_for_status() # 捕获4xx/5xx HTTP错误 jsonData = response.json() # 校验响应中是否存在有效数据字段 if "Table" in jsonData and jsonData["Table"]: data.extend(jsonData["Table"]) payload['Pageno'] += 1 else: should_fetch_next_page = False except requests.exceptions.RequestException as e: print(f"请求错误: {e}") should_fetch_next_page = False except ValueError: print("API返回非JSON格式数据,可能被反爬拦截") should_fetch_next_page = False df = pd.DataFrame(data) print(df)
额外调试建议
- 对比浏览器请求:打开BSEIndia官方公告页,用F12开发者工具查看实际网络请求,核对参数、请求头与代码的差异
- 验证参数取值:检查
strType、strSearch等参数的可选值是否有变更,可通过页面表单的选项确认 - 调整分页逻辑:若API返回总页数字段,可直接根据总页数控制抓取次数,替代空数据判断逻辑
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

