解析Instagram数据时遭遇JSON未终止字符串错误求助
我正在解析从Instagram获取的数据,用于生成Gephi可可视化的社交图谱。每个账号对应./data/{person}/following.har和./data/{person}/profile.json文件。在将数据提取到./out/people.json时,反复遇到错误:
json.decoder.JSONDecodeError: Unterminated string at: line 1067001 column 26 (char 87399905)
错误发生在代码的data = json.loads(f.read())行。我尝试过用ftfy工具修复,但没有效果。报错的行内容为:"url": "https://static.cdninstagram.com/rsrc.php/v3ikSh4/yq/l/en_US/ueR5Vvb4hPlbfkjYLCs4rGemD-jplRG0pz
以下是未使用ftfy的代码:
import json import os import re import base64 def extract_profile(data) -> list: return data['graphql']['user'] def extract_followings(data) -> list: friendship_api_url = r'https://i.instagram.com/api/v1/friendships/.*/following' contents = [entry['response']['content'] for entry in data['log']['entries'] if re.match(friendship_api_url, entry['request']['url'])] # extract json data users = [] for content in contents: if 'text' not in content: continue text = content['text'] if 'encoding' in content: encoding = content['encoding'] if encoding == 'base64': decodedBytes = base64.b64decode(text) decodedStr = str(decodedBytes, 'utf-8') user_json = json.loads(decodedStr) users.extend(user_json['users']) else: user_json= json.loads(text) users.extend(user_json['users']) return users def extract_person(person: str): with open(f'./data/{person}/following.har', 'r', errors='ignore') as f: data = json.loads(f.read()) followings = extract_followings(data) with open(f'./data/{person}/profile.json', 'r') as f: data = json.loads(f.read()) profile = extract_profile(data) output = { 'general': profile, 'followings': followings } return output, profile['id'] def extract_all(): persons = os.listdir('./data') users = {} for person in persons: output, id = extract_person(person) users[id] = output with open('./out/people.json', 'w') as f: f.write(json.dumps(users)) extract_all()
这个错误是HAR文件导出时出现截断,导致JSON字符串未完全闭合(url字段的引号未结束)。可以尝试以下几种修复方式:
1. 手动修复报错行
找到报错的第1067001行,补全url字段的闭合引号。如果内容确实缺失,可以直接删除这个不完整的键值对,或者用占位符替换,比如:"url": "https://static.cdninstagram.com/rsrc.php/placeholder"
2. 正则自动修复不完整JSON
在读取HAR文件后,先通过正则修复常见的截断问题:
import re def fix_truncated_json(raw_text): # 修复未闭合的双引号字符串 raw_text = re.sub(r'"([^"]*)$', r'"\1"', raw_text) # 移除末尾多余的逗号 raw_text = raw_text.rstrip(',') # 补全未闭合的大括号/中括号 open_braces = raw_text.count('{') - raw_text.count('}') open_brackets = raw_text.count('[') - raw_text.count(']') raw_text += '}' * open_braces + ']' * open_brackets return raw_text
修改读取HAR文件的代码:
with open(f'./data/{person}/following.har', 'r', errors='ignore') as f: raw_text = f.read() fixed_text = fix_truncated_json(raw_text) data = json.loads(fixed_text) followings = extract_followings(data)
3. 使用容错JSON解析库
用支持容错解析的库跳过语法错误,比如demjson:
先安装依赖:
pip install demjson
替换解析代码:
import demjson with open(f'./data/{person}/following.har', 'r', errors='ignore') as f: data = demjson.decode(f.read()) followings = extract_followings(data)
4. 重新导出完整HAR文件
如果是浏览器导出时中途中断导致的截断,建议重新导出:在浏览器开发者工具的网络面板,等待所有请求加载完成后再导出HAR文件,避免中途停止。
内容的提问来源于stack exchange,提问作者Macabe

