如何抓取动态加载JSON内容的网站?以NSE公告页为例
解决NSE印度国家证券交易所公告爬虫API被限制的问题
针对你遇到的API调用几次后返回"Resource not found"的问题,以下是实际可落地的解决思路:
1. 先建立有效会话,携带必要Cookie
NSE的API依赖主页面设置的会话Cookie(如NSC_*系列),直接调用API会因为缺少会话标识被拦截。步骤:
- 先请求目标主页面
https://www.nseindia.com/companies-listing/corporate-filings-announcements,获取并保存响应中的Cookie - 后续所有API请求都携带这些Cookie,同时确保请求头包含
Referer: https://www.nseindia.com/和真实的浏览器User-Agent
示例代码(Python requests):
import requests import time session = requests.Session() # 先获取会话Cookie session.get("https://www.nseindia.com/companies-listing/corporate-filings-announcements", 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" }) # 调用API时复用会话 api_url = "你的API接口地址" response = session.get(api_url, headers={ "Referer": "https://www.nseindia.com/", "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" }) print(response.json())
2. 提取API的动态验证参数
NSE部分API会要求动态生成的参数(如timestamp、加密签名),这些参数通常隐藏在页面的JS代码或HTML元素中:
- 打开浏览器开发者工具,查看页面加载时的API请求,对比不同请求的参数差异
- 从页面源码中查找生成这些参数的JS逻辑,或者直接提取页面中已生成的参数值(比如通过正则匹配页面中的token)
3. 严格控制请求频率
反爬系统会检测短时间内的高频请求,直接限制访问:
- 每次API请求后添加随机延迟(2-5秒),避免连续请求
- 不要一次性请求大量数据,分批次抓取,模拟人类浏览的节奏
4. 备选方案:用无头浏览器渲染页面
如果API反爬逻辑过于复杂,直接模拟浏览器渲染获取静态表格内容:
- 使用Playwright或Selenium打开目标页面,等待表格加载完成后直接提取HTML表格数据
- 示例(Playwright Python):
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page(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") page.goto("https://www.nseindia.com/companies-listing/corporate-filings-announcements") page.wait_for_selector("table") # 等待表格加载 table_html = page.inner_html("table") # 后续解析table_html即可 browser.close()
内容的提问来源于stack exchange,提问作者Alpha389
相关产品推荐
相关产品推荐

