【问题标题】:Iterating through many json links, but encountering a jsondecode error遍历许多json链接,但遇到jsondecode错误
【发布时间】:2018-08-16 03:10:32
【问题描述】:

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

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

问题是我得到一个 JSONDecodeError。我做错了什么,如何改正?

Traceback(最近一次通话最后一次):

文件“/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.decode(s)

文件“/usr/lib/python3.6/json/decoder.py”,第 342 行,在解码中 raise JSONDecodeError("额外数据", 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

【问题讨论】:

    标签: python json mongodb python-3.x pymongo


    【解决方案1】:

    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
    

    【讨论】:

    • 所以要迭代并获取所有链接,逐行读取并将其解析为 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)
    • 我已经更新了我原来的问题以获得更好的格式。
    • 我已经把它放在原始问题的末尾了。
    • @aquatic7,在urlopen请求中添加User-Agent标头
    • @aquatic7,现在可以用了吗?供您参考 - stackoverflow.com/questions/13303449/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多