You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键优化点

  1. 增加异常处理:捕获请求过程中的网络错误、API错误,避免程序崩溃。
  2. 轮询等待扫描完成:代替固定的time.sleep(10),如果扫描提前完成可以立即处理,超时则提示用户。
  3. 存在性检查:每次访问嵌套字段前先检查是否存在,避免KeyError。
  4. 收集所有重定向URL:把结果存入列表,方便后续处理(比如保存到文件)。

额外提示

  • 确保你的API密钥有足够的权限,并且不要把密钥硬编码到代码里(可以用环境变量管理)。
  • 如果扫描的URL重定向次数较多,requests列表里会有多个包含redirectResponse的项,上面的代码会全部提取出来。

内容的提问来源于stack exchange,提问作者tjw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 18:12:42