遍历许多 json 链接,但遇到 jsondecode 错误



我有一个这个JSON,其中包含来自许多"视频"的信息。在JSON中的每个"视频"中,都有另一个指向包含"消息"的新JSON的链接。

我正在尝试遍历"消息"JSON链接并将它们插入MongoDB数据库。

问题是我收到一个JSONDecodeError。我做错了什么,我如何纠正它?

回溯(最近一次调用):

文件 "/import_messages_dev.py",第 35 行,在 raw_messages_data = requests.get(url3).json()

文件 "venv1/lib/python3.6/site-packages/requests/models.py",第 892 行,以 json 格式 return complexjson.loads(self.text, **kwargs)

文件 "/usr/lib/python3.6/json/init.py",第 354 行,在加载中 返回 _default_decoder.解码

文件 "/usr/lib/python3.6/json/decoder.py",第 342 行,解码 引发 JSONDecodeError("Extra data", s, end) json.decoder.JSONDecodeError: 额外数据: 第 2 行第 1 列(字符 380)

import urllib.parse
import requests
import pymongo
###  DATABASE ####
# Connect to database // login user:password
uri = 'mongodb://testuser:password@ds245687.mlab.com:45687/liveme'
# Set client.
client = pymongo.MongoClient(uri)
# Set database.
db = client.get_database()
# Create collection.
messages = db['messages']
# The url to the live.me replays.
replay_url = "http://live.ksmobile.net/live/getreplayvideos?"
userid = 895324164037541888
# Parsing the urls for replays and profile with the userid.
url2 = replay_url + urllib.parse.urlencode({'userid': userid}) + '&page_size=1000'
# Printing urls for own validation.
print(f"Replay url: {url2}n")
# Pull the data from replay json.
raw_replay_data = requests.get(url2).json()
print("Message links: ")
# Insert messages to database.
for i in raw_replay_data['data']['video_info']:
url3 = i['msgfile']
raw_messages_data = requests.get(url3).json()
messages.insert_many(raw_messages_data)
print(url3)
client.close()

更新以获取答案的进一步帮助

因此,要迭代并获取所有链接,请逐行读取并将其解析为 JSON 并将其插入数据库,我正在尝试这样做,但它会产生一个新错误。

for i in raw_replay_data['data']['video_info']:
url3 = i['msgfile']
raw_message_data = urllib.request.urlopen(url3)
for line in raw_message_data:
json_data = json.loads(line)
messages.insert_many(json_data)

新错误为:

Traceback (most recent call last):
File "/import_messages_dev.py", line 54, in <module>
raw_message_data = urllib.request.urlopen(url3)
File "/usr/lib/python3.6/urllib/request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.6/urllib/request.py", line 532, in open
response = meth(req, response)
File "/usr/lib/python3.6/urllib/request.py", line 642, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python3.6/urllib/request.py", line 570, in error
return self._call_chain(*args)
File "/usr/lib/python3.6/urllib/request.py", line 504, in _call_chain
result = func(*args)
File "/usr/lib/python3.6/urllib/request.py", line 650, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
url3

可能包含以下值: http://s.live.ksmobile.net/cheetahlive/20/7e/15204559238152116852/15204559238152116852.json

包含单个字典,但整个文件不存储为 JSON 数组。

结构是这样的:

{ "channelType":"TEMPGROUP", ... } # line 1
{ "channelType":"TEMPGROUP", ... } # line 2

因此需要逐行读取并将每行解析为 JSON。

response = urllib.request.urlopen(url3)
for line in response:
json_data = json.loads(line)
# Do something with json_data

相关内容

最新更新