У меня есть этот код:
import requests
r = requests.get('https://www.instagram.com/p/CJDxE7Yp5Oj/?__a=1')
data = r.json()['graphql']['shortcode_media']
Почему я получаю такую ошибку?
C:\ProgramData\Anaconda3\envs\test\python.exe C:/Users/Solba/PycharmProjects/test/main.py
Traceback (most recent call last):
File "C:/Users/Solba/PycharmProjects/test/main.py", line 4, in <module>
data = r.json()
File "C:\ProgramData\Anaconda3\envs\test\lib\site-packages\requests\models.py", line 900, in json
return complexjson.loads(self.text, **kwargs)
File "C:\ProgramData\Anaconda3\envs\test\lib\json\__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "C:\ProgramData\Anaconda3\envs\test\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\ProgramData\Anaconda3\envs\test\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Process finished with exit code 1
Причина в том, что ответ возвращает не JSON, а целую HTML-страницу. Попробуйте r.text
вместо r.json()...
, а затем делайте оттуда все, что хотите.
Если вы не уверены, какой тип контента он возвращает:
h = requests.head('https://www.instagram.com/p/CJDxE7Yp5Oj/?__a=1')
header = h.headers
contentType = header.get('content-type')
print(contentType)
На основе вашего URL он возвращает text/html
.
В качестве альтернативы вы можете попробовать добавить User-Agent
в свой запрос — это эмулирует запрос, чтобы он выглядел так, как будто он исходит из браузера, а не скрипта.
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/46.0.2490.80'
}
r = requests.get('https://www.instagram.com/p/CJDxE7Yp5Oj/?__a=1', headers=headers)
data = r.json()
Если вы перейдете по ссылке: instagram.com/p/CJDxE7Yp5Oj/?__a=1 Вы увидите, что это уже написано в json, как мне сделать так, чтобы это отвечало?
r.json()
ожидает, что API вернет строку JSON. API должен явно указать, что он отвечает с помощью JSON через заголовки ответа.
В этом случае URL-адрес, который вы запрашиваете, либо не отвечает правильным JSON, либо явно не говорит, что отвечает JSON.
Сначала вы можете проверить ответ, отправленный URL-адресом:
data = r.text
print(data)
Если ответ можно рассматривать как строку JSON, вы можете обработать его с помощью:
import json
data = json.loads(r.text)
Примечание:
Вы также можете проверить заголовки content-type
и Accept
, чтобы убедиться, что запрос и ответ имеют требуемый тип данных.
Отвечает ли это на ваш вопрос? JSONDecodeError: Ожидаемое значение: строка 1, столбец 1 (символ 0)