#python #parsing #python-requests #instagram-api
Вопрос:
Проблема: когда я пытаюсь использовать первый приведенный ниже код, я получил json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
. Весь этот код вчера работал нормально, а вчера он тоже перестал работать. Сегодня это тоже не работает. Странная часть в том, что я только что запустил второй код (также ниже), и он сработал один раз, а затем после другого запуска снова возникла та же проблема!
Ошибка возникает в строке:
post_info = instagram_web_api.media_info2("<SHORTCODE>")
Пожалуйста, помогите : (. У русского переполнения стека нет ответов.
Я использую instagram-private-api 1.6.0.0
1-й код, когда я получаю эту ошибку:
from instagram_web_api import Client
instagram_web_api = Client(auto_patch=False, drop_incompat_keys=False)
post_info = instagram_web_api.media_info2('CVNgb7us34V') # Get the short code.
post_text = post_info['edge_media_to_caption']['edges'][0]['node']['text']
print(post_text)
2-й код:
from instagram_web_api import Client
web_api = Client(auto_patch=False, drop_incompat_keys=False)
user_feed_info = web_api.user_feed('329452045', count=10)
Комментарии:
1. Проверьте, что вы пытаетесь расшифровать, что ваш код предполагает, что это JSON, потому что ошибка говорит о том, что это не JSON.
2. @balmy, я думаю, что это правильный JSON, потому что короткий код для поста я взял из фактического URL поста (и перепробовал много разных постов), а во-вторых, потому что вчера этот код отлично работал.
3. @2e0byo, извините, что вы имеете в виду? Я не могу напечатать «post_info», потому что эта проблема появляется до того, как «post_info» получит данные.
4. Забудьте о вчерашнем дне, сегодня ваш код терпит неудачу. Если бы он получал JSON, он не выдал бы эту ошибку, следовательно, он не получает JSON. Посмотрите на то, что вы получаете, потому что это, вероятно, HTML-код с информацией, которая поможет вам понять, что происходит.
5. @balmy, я не понимаю, где искать, я посмотрел в HTML-структуре поста и не знаю, что я там должен найти. : ( Пожалуйста, помогите
Ответ №1:
Проблема заключается в том, что библиотека, которую вы используете, и instagram: последняя не отправляет вам JSON туда, куда вы ожидаете.
Если вы посмотрите на источник media_info2
, он выглядит так:
def media_info2(self, short_code):
"""
Alternative method to get media info. This method works for carousel media.
:param short_code: A media's shortcode
:param kwargs:
:return:
"""
headers = {
'User-Agent': self.user_agent,
'Accept': '*/*',
'Accept-Language': 'en-US',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'close',
'Referer': 'https://www.instagram.com',
'x-requested-with': 'XMLHttpRequest',
}
info = self._make_request(
'https://www.instagram.com/p/{0!s}/'.format(short_code),
query={'__a': '1', '__b': '1'},
headers=headers)
...
После вашей обратной трассировки обнаружена ошибка make_request
. Итак, мы идем и смотрим на источник, и мы видим, что важные строки:
self.logger.debug('REQ DATA: {0!s}'.format(data))
res = self.opener.open(req, data=data, timeout=self.timeout)
...
if return_response:
return res
response_content = self._read_response(res)
self.logger.debug('RES BODY: {0!s}'.format(response_content))
return json.loads(response_content)
Теперь у нас есть все необходимое для ручной отладки, так как программа работает следующим образом:
- установите заголовки и передайте их и URL-адрес в make_request
- получение данных с URL-адреса
- дата анализа в формате json
- возвращаемые данные
Мы могли бы составить наш собственный вызов opener
или даже просто запустить curl
его по переданному URL _make_request
-адресу , или временно изменить код , чтобы напечатать некоторые материалы и быть немного более подробными. Но в этом случае у нас есть еще более простой вариант: код уже будет отлаживаться для нас, нам просто нужно сказать, чтобы он был подробным:
import logging
logging.basic_config(level=logging.DEBUG)
Поместите это в начало вашего неудачного сценария и запустите его снова, и он должен выдать много данных, которые точно расскажут вам, что он делает. Поскольку он печатает все тело возврата, вы должны получить все, что он возвращает, и быть в состоянии понять, что происходит.
И помни … используй источник, Люк.
Ладно, это было ужасно, но единственный способ узнать, что делает код, — это прочитать исходный код. Самое замечательное в python — это его читабельность. Сравните это с попыткой разобраться в какой-нибудь библиотеке c , прочитав ее…
Комментарии:
1. Боже мой, какой ты милый!!! И большое спасибо вам за вашу помощь, сейчас я получаю HTML-код с некоторыми данными из Instagram, но здесь нет текста поста, и я также не знаю, как использовать этот html-текст, потому что он написан в моем CMD..
2. посмотрите, что там написано: если это просто сообщение, одно из предположений в библиотеке нарушено (т. Е. метод, используемый для получения json, не работает). не копаясь в библиотеке, я не знаю, как это исправить, но вы можете попробовать явно запросить JSON, заменив
Accept
строку на"Accept": "application/json"
. Если вы возитесь, клонируйтеinstagram-private-api
с github и поместитеinstagram_web_api
в ту же папку, что и ваш код, и измените его там. Или откройте проблему в проекте git, если вы считаете, что это должно сработать (вероятно). Но обратите внимание на количество открытых вопросов на данный момент…3. И я также снова запустил 2-й код, и теперь он работает, но первый код все еще не работает, и это безумие
4. конечно, код, который взаимодействует с серверами, находится во власти этих серверов, и это неофициальный набор привязок, поэтому он будет, как правило, не в ногу с серверами instagram. К сожалению, это факт жизни для пишущих пользователей api
5. прояснили ответ: вы не можете (легко) использовать выходные данные отладки: это просто для того, чтобы увидеть, что происходит, и что вы на самом деле отправляете.
Ответ №2:
Проблема заключалась в том, что Instagram не разрешает много запросов в определенное время, поэтому после того, как я много раз запрашивал его, он блокирует мой доступ к любой информации из поста. Решение состоит в том, чтобы войти в систему через API. Это все.
Комментарии:
1. Теперь вы верите сообщению об ошибке, т. е. веб-сайт не предоставлял JSON?