如何在Python中清理Censys API响应无效字符以生成合法JSON
问题解决与代码评估
问题根源
你的初始代码直接将每页的JSON数组追加写入文件,导致最终文件是多个JSON数组的拼接(比如[...][...]),中间的}][{就是前一页数组的结尾和后一页数组的开头,自然不符合JSON格式。
待测试代码的问题
这段代码完全不可行,存在多个核心错误:
- Censys的
search方法返回的是迭代器,不是列表,不能用len(data)获取长度,调用后会直接耗尽迭代器,后续循环无法获取数据。 data = data.replace('}][{', '},{')逻辑错误,data是迭代器对象,不是字符串,根本没有replace方法。- 循环内修改
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)
最佳实践建议
- 从根源避免格式问题:不要等错误产生后再修复,而是在写入阶段就构建合法的JSON结构,这比事后替换字符更可靠。
- 正确处理迭代器:Censys API返回的是迭代器,不要用
len()或强制转列表(除非你确定内存足够),直接遍历即可。 - 添加异常处理:加入
try-except块处理API请求失败、网络波动、JSON序列化错误等情况,避免脚本中途崩溃丢失进度。 - 严格遵守速率限制:按照Censys官方要求设置
sleep时间,避免因请求过于频繁被封禁。 - 增量安全策略:如果数据量极大,考虑按页保存为单独的JSON文件,后续再合并,避免单个大文件损坏导致全部数据丢失。
- 验证最终格式:写入完成后,用
json.load读取文件验证格式是否合法,确保数据可用。
内容的提问来源于stack exchange,提问作者bbartling
相关产品推荐
相关产品推荐

