如何通过Python从带&__d=dis的Instagram链接获取JSON数据?
解决Instagram带
&__d=dis参数的JSON数据获取问题 出现JSONDecodeError的核心原因是,Instagram对带有__d=dis参数的接口响应格式做了调整,或是请求头/会话有效性存在问题,导致返回内容并非标准JSON。以下是具体解决步骤:
1. 先排查响应内容
不要直接调用.json()方法,先打印响应的原始文本,确认返回内容类型:
response = requests.get(url, headers=headers) print(response.text)
常见异常情况:
- 返回登录页面HTML(说明SESSIONID过期或无效)
- 响应开头带有
for (;;);前缀(Instagram对部分接口的特殊包装)
2. 调整请求头参数
旧版User-Agent可能被识别为异常请求,更新为近期浏览器UA,同时补充移动端接口常用的x-ig-app-id参数:
headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "cookie": f"sessionid={SESSIONID};", "x-ig-app-id": "936619743392459" }
3. 处理带前缀的响应内容
如果响应开头是for (;;);,需要先移除该前缀再解析JSON:
import requests url = 'https://www.instagram.com/p/Ch656GRoyuO/?__a=1&__d=dis' SESSIONID = '9hfMsiKKe8YHWVqVYG9xv3h8f7MITWWZ' headers = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "cookie": f"sessionid={SESSIONID};", "x-ig-app-id": "936619743392459" } response = requests.get(url, headers=headers) raw_content = response.text.strip() # 处理特殊前缀 if raw_content.startswith('for (;;);'): cleaned_content = raw_content[len('for (;;);'):].strip() data = requests.utils.json_loads(cleaned_content) else: try: data = response.json() except requests.exceptions.JSONDecodeError: print("无法解析JSON,响应内容:", raw_content) data = None if data: items = data.get("items") print(items)
关键注意事项
- SESSIONID有效性:必须确保SESSIONID是当前登录状态下的有效值,过期或无效的会话会返回登录页面,无法获取JSON数据。
- 接口变动:Instagram的非公开API参数(如
__a=1、__d=dis)随时可能调整,若上述方法失效,需重新抓包分析最新请求格式。
内容的提问来源于stack exchange,提问作者user16813646
相关产品推荐
相关产品推荐

