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

如何在Python中清理Censys API响应无效字符以生成合法JSON

问题解决与代码评估

问题根源

你的初始代码直接将每页的JSON数组追加写入文件,导致最终文件是多个JSON数组的拼接(比如[...][...]),中间的}][{就是前一页数组的结尾和后一页数组的开头,自然不符合JSON格式。

待测试代码的问题

这段代码完全不可行,存在多个核心错误:

  1. Censys的search方法返回的是迭代器,不是列表,不能用len(data)获取长度,调用后会直接耗尽迭代器,后续循环无法获取数据。
  2. data = data.replace('}][{', '},{')逻辑错误,data是迭代器对象,不是字符串,根本没有replace方法。
  3. 循环内修改data会彻底打乱迭代逻辑,后续步骤完全无法正常执行。

正确的实现方式

不需要事后替换字符,从写入时就保证生成合法的JSON结构,有两种可靠方案:

方案1:逐页写入并维护数组结构

适合数据量极大、不想占用过多内存的场景:

import json
from censys.search import CensysHosts
import time

h = CensysHosts()
data_iter = h.search("services.#@.$:*", per_page=100, pages=500)

with open('data.json', 'w') as json_file:
    # 先写入数组开头
    json_file.write('[')
    first_page = True
    for page in data_iter:
        if not first_page:
            # 非第一页,先写数组元素分隔符
            json_file.write(',')
        # 去掉当前页数组的首尾括号,只保留内部元素
        json_file.write(json.dumps(page)[1:-1])
        first_page = False
        time.sleep(2)
    # 写入数组结尾
    json_file.write(']')

方案2:先收集所有数据再统一写入

适合数据量适中、内存足够的场景,代码更简洁:

import json
from censys.search import CensysHosts
import time

h = CensysHosts()
all_data = []

for page in h.search("services.#@.$:*", per_page=100, pages=500):
    all_data.extend(page)
    time.sleep(2)

with open('data.json', 'w') as json_file:
    json.dump(all_data, json_file)

最佳实践建议

  1. 从根源避免格式问题:不要等错误产生后再修复,而是在写入阶段就构建合法的JSON结构,这比事后替换字符更可靠。
  2. 正确处理迭代器:Censys API返回的是迭代器,不要用len()或强制转列表(除非你确定内存足够),直接遍历即可。
  3. 添加异常处理:加入try-except块处理API请求失败、网络波动、JSON序列化错误等情况,避免脚本中途崩溃丢失进度。
  4. 严格遵守速率限制:按照Censys官方要求设置sleep时间,避免因请求过于频繁被封禁。
  5. 增量安全策略:如果数据量极大,考虑按页保存为单独的JSON文件,后续再合并,避免单个大文件损坏导致全部数据丢失。
  6. 验证最终格式:写入完成后,用json.load读取文件验证格式是否合法,确保数据可用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:15:35