JSONDecodeError при использовании цикла for с данными из Firestore итерирования запроса API - PullRequest
1 голос
/ 30 апреля 2019

Я заблудился относительно того, почему эта ошибка продолжает происходить и как ее решить.

Я пытаюсь извлечь данные из одной из моих коллекций пожарных хранилищ, используя идентификатор (который является биржевым тикером) и повторяю этот идентификатор через цикл for в API, который возвращает массив JSON.

Каждый раз, когда я запускаю это, примерно на одной трети пути я получаю следующую ошибку, сначала показывая как Ошибка: 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)

1 Ответ

0 голосов
/ 30 апреля 2019

Запрос на акции для компании, которой нет в служебных записях, возвращает 404.

print -ing на стандартный вывод, когда этого не достаточно, чтобы справиться с этим, так какТело ответа для кода состояния, отличного от 200, не является допустимым текстом JSON.

В зависимости от вашей организации, вам нужно либо пропустить ответы не 200, либо получить информацию об акциях из другой службы, либо зарегистрировать ее как критическую проблемутак что вы можете применить политику для компаний, чья информация об акциях больше не предлагается службой.

Первый вариант пропуска ответов, отличных от 200, можно выполнить в следующем пункте.

if r.status_code != 200: 
    print("Error:", r.status_code)
    continue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...