Надеясь добавить серию дат через вызов API, используя цикл for

#python #html #pandas #api #for-loop

Вопрос:

Проблема: когда я запускаю фрагмент ниже, я получаю следующую ошибку: «Ошибка URL: <ошибка urlopen [Errno 54] Сброс соединения одноранговым узлом>».

Когда я запускаю один и тот же фрагмент с диапазоном дат вместо переменной, он работает.

У меня есть список дат, которые мне нужно передать через вызов API.

Вот процесс, который нужно воспроизвести

  1. создайте фрейм данных для нужных мне диапазонов дат пример
  2. Затем запустите цикл, чтобы получить вызов для всех диапазонов дат в первом примере фрейма данных

фрагмент кода python

 earnings_info = []
for earnings_api in all_earnings['earnings_api']:
    web_add = earnings_api
    ticker_hist_earnings = pd.read_json(web_add)
    earnings_info.append(ticker_hist_earnings)
    sleep(10)
 

Ответ №1:

Для этого может быть несколько причин. Наиболее распространенным из них является то, что API распознал ваш вызов как вызов бота и заблокировал ваше соединение. Если вы используете встроенный URL-вызов pandas, вам необходимо переписать его, чтобы получить из библиотеки запросов и включить заголовки браузера.

 import requests
response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36'})
 

и после получения всех данных вы можете добавить эти данные в pandas df.

Комментарии:

1. интересно, что теперь появляется ошибка 429: Слишком много Запросов

2. Не могли бы вы, пожалуйста, добавить задержку между вызовами запроса

3. Привет, вы не заменили read_json на ответ. куда вы делаете запрос по телефону ? Пожалуйста, замените строку кода ticker_hist_earnings следующей строкой ticker_hist_earnings = pd.read_json(response.json())

4. Привет, да, теперь я понимаю. pd.read_json отправит внутренний запрос, и это вызовет проблему в начале. Вы получаете результаты для одного запроса, это правда. Поскольку вам нужно отправить пакет запросов, вам необходимо переключиться на архитектуру ответа на запрос. В противном случае API подумает, что вы бот. Пожалуйста, не используйте read_json. Вместо этого используйте это from pandas import json_normalize df = json_normalize(dresponse.json()) это позволит получить все данные в pandas df

5. Привет, добро пожаловать и большое вам спасибо за добрые слова. Не могли бы вы, пожалуйста, сделать мне одолжение и тоже озвучить мой ответ.