URLscan API项目中嵌套JSON解析报错(TypeError):重定向URL提取方案咨询
解决urlscan.io API提取重定向URL的TypeError问题
你遇到的TypeError: list indices must be integers or slices, not str错误很明确:r['data']['requests']是一个列表,而不是单个字典。你直接用字符串键['redirectResponse']去索引列表,Python当然会报错——列表只能用整数索引或者切片来访问元素。
问题根源
urlscan.io的API返回结果中,data.requests是一个包含所有请求记录的数组,每个数组元素是一个独立的请求对象。只有发生重定向的请求才会包含redirectResponse字段,所以你需要遍历这个列表,逐个检查每个请求是否存在重定向信息。
修正后的代码
下面是可以正确提取所有重定向URL的代码,我还加了一些健壮性优化:
import requests import json import time # 替换成你的urlscan.io API密钥 apikey = "YOUR_API_KEY_HERE" # 目标扫描URL url = 'https://www.coke.com' # 请求头配置 headers = {'API-Key': apikey, 'Content-Type': 'application/json'} data = {"url": url, "visibility": "public"} # 提交扫描请求 try: response = requests.post('https://urlscan.io/api/v1/scan/', headers=headers, data=json.dumps(data)) response.raise_for_status() # 检查请求是否成功,失败则抛出异常 scan_result = response.json() responseUrl = scan_result['api'] except requests.exceptions.RequestException as e: print(f"提交扫描请求失败: {e}") exit() # 轮询等待扫描完成(比固定sleep更高效) max_retries = 12 retry_interval = 5 scan_completed = False for _ in range(max_retries): try: req = requests.Session() result = req.get(responseUrl).json() if result.get('status') == 'completed': scan_completed = True break print("扫描中,等待...") time.sleep(retry_interval) except requests.exceptions.RequestException as e: print(f"获取扫描结果失败: {e}") exit() if not scan_completed: print("扫描超时,请稍后重试") exit() # 提取所有重定向URL redirect_urls = [] if 'data' in result and 'requests' in result['data']: for request_item in result['data']['requests']: # 检查当前请求是否包含重定向响应 if 'redirectResponse' in request_item and 'url' in request_item['redirectResponse']: redirect_url = request_item['redirectResponse']['url'] redirect_urls.append(redirect_url) print(f"找到重定向URL: {redirect_url}") else: print("扫描结果中未找到请求数据") # 如果需要可以返回或保存重定向URL列表 # print("所有重定向URL:", redirect_urls)
关键优化点
- 增加异常处理:捕获请求过程中的网络错误、API错误,避免程序崩溃。
- 轮询等待扫描完成:代替固定的
time.sleep(10),如果扫描提前完成可以立即处理,超时则提示用户。 - 存在性检查:每次访问嵌套字段前先检查是否存在,避免
KeyError。 - 收集所有重定向URL:把结果存入列表,方便后续处理(比如保存到文件)。
额外提示
- 确保你的API密钥有足够的权限,并且不要把密钥硬编码到代码里(可以用环境变量管理)。
- 如果扫描的URL重定向次数较多,
requests列表里会有多个包含redirectResponse的项,上面的代码会全部提取出来。
内容的提问来源于stack exchange,提问作者tjw
相关产品推荐
相关产品推荐

