【问题标题】:JSONDecodeError when using for loop with firestore data iterating API request将 for 循环与 firestore 数据迭代 API 请求一起使用时出现 JSONDecodeError
【发布时间】:2019-09-19 13:12:38
【问题描述】:

我不知道为什么这个错误不断发生以及如何解决它。

我正在尝试使用 ID(它是股票代码)从我的一个 firestore 集合中取出数据,并通过 for 循环将该 ID 迭代到返回 JSON 数组的 API。

每次我运行这个,大约三分之一的时候我会得到以下错误,首先显示为错误:404,然后显示以下内容:

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

该脚本适用于数据的前三分之一,但如果我删除集合中错误所在的项目,它不能解决问题,所以我认为它与它登陆的文档。

我错过了什么吗?

我尝试为 404 错误设置一个异常,但要么我执行得不好,要么没有解决问题。

import requests
import json
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
import datetime

cred = credentials.Certificate("./serviceAccountKey.json")
firebase_admin.initialize_app(cred)

db = firestore.client()
doc_ref1 = db.collection(u'Quiver').stream()

for doc in doc_ref1:
    symbol = doc.id
    api_url = "https://api.iextrading.com/1.0/stock/{}/company".format(symbol)
    query_url = api_url
    r = requests.get(query_url)

    if r.status_code != 200: 
        print("Error:", r.status_code)

    if r.status_code == 404: 
        print("Error:", r.status_code)

    json_stock = r.json()

    symbol = json_stock['symbol']
    companyName = json_stock['companyName']
    exchange = json_stock['exchange']
    industry = json_stock['industry']
    website = json_stock['website']
    description = json_stock['description']
    CEO = json_stock['CEO']
    issueType = json_stock['issueType']
    sector = json_stock['sector']
    tags = json_stock['tags']

    updateTime = datetime.datetime.now()

    doc_ref = db.collection(u'Quiver').document(u'{}'.format(symbol))
    doc_ref.set({
        u'symbol':u'{}'.format(symbol),
        u'Company Name':u'{}'.format(companyName),
        u'Exchange':u'{}'.format(exchange),
        u'Industry':u'{}'.format(industry),
        u'Website':u'{}'.format(website),
        u'Description':u'{}'.format(description),
        u'Issue Type':u'{}'.format(issueType),
        u'Sector':u'{}'.format(sector),
        u'Tags':u'{}'.format(tags),
        u'Last Update Time':u'{}'.format(updateTime)
    })

    #docs = doc_ref.get({u'summary'})
    print(symbol)

【问题讨论】:

    标签: python json python-requests google-cloud-firestore


    【解决方案1】:

    对服务记录中不存在的公司的股票请求返回404

    print-ing 到 stdout 发生这种情况时不足以处理此问题,因为非 200 状态代码的响应正文不是有效的 JSON 文本。

    根据您的业务,您必须跳过非 200 回复、从其他服务获取股票信息或将其记录为关键问题,以便您可以为不再提供股票信息的公司应用政策通过服务。

    第一个跳过非200 响应的选项可以在以下子句中完成。

    if r.status_code != 200: 
        print("Error:", r.status_code)
        continue
    

    【讨论】:

    • 谢谢奥卢瓦弗尼!!在 if 语句中添加 continue 就可以了!它现在正在遍历文档。对于某些值,它现在仍然会打印 404 错误,我不确定为什么会这样。有什么想法吗?
    • 这是因为从 Firestore 加载的公司符号在 API 服务中不可用,或者甚至不是有效的公司符号
    • 嗯,有道理。非常感谢您的及时回复!
    猜你喜欢
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多