POST-запрос работает в Postman, но не в Python-запросах (200 ответов с обнаружением робота)
У меня есть POST-запрос, который отлично работает как с Postman, так и cURL (он возвращает JSON-блок данных). Однако, когда я выполняю точно такой же запрос с библиотекой запросов Python, я получаю 200 успешных ответов, но вместо своего большого двоичного объекта JSON я получаю следующее:
<html>
<head>
<META NAME="robots" CONTENT="noindex,nofollow">
<script src="/_Incapsula_Resource?SWJIYLWA=5074a744e2e3d891814e9a2dace20bd4,719d34d31c8e3a6e6fffd425f7e032f3">
</script>
<body>
</body></html>
Я использовал подборки HTTP-запросов, чтобы убедиться, что запрос от Postman/cURL точно такой же, как и запрос Python.
Вот мой запрос почтальона в cURL:
curl -X POST \
https:/someurl/bla/bla \
-H 'Content-Type: application/json' \
-H 'Postman-Token: 2488e914-531e-4ac7-ae8d-8490b2242396' \
-H 'Referer: https://www.host.com/bla/bla/' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:65.0) Gecko/20100101 Firefox/65.0' \
-H 'cache-control: no-cache' \
-d '{"json1":"blabla","etc":"etc"}'
... и вот мой код Python:
payload = {
"json1": "blabla",
"etc": "etc",
}
headers = {
'Host': 'www.host.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate, br',
'Referer': 'https://www.host.com/bla/bla/',
'Content-Type':'application/json',
'X-Requested-With': 'XMLHttpRequest',
'Connection': 'keep-alive',
'Origin': 'https://www.host.com',
}
s = requests.Session()
response_raw = s.post(url, json=payload, headers=headers)
print(response_raw)
print(response_raw.text)
Я проверил, что полезные данные и заголовки являются правильными и действительными. Любая помощь приветствуется; Спасибо!
3 ответа
Вы получаете ответ 200 об успешном выполнении, но в ответе нет данных JSON.
Это означает, что это просто объект ответа. Он содержит только код ответа
на информацию извлечения двоичных объектов из ответа, объекта ответа обращенного в JSON
простоjson_resp = response_raw.json()
Эта json_resp
содержит фактические данные вашего ответа.
У меня была похожая проблема, которую я смог решить, отправив файл cookie в запросе. Попробуй это:
...
my_cookie = {"Cookie": "cookie text..."}
s = requests.Session()
response_raw = s.post(url, json=payload, headers=headers, cookies=my_cookie)
print(response_raw)
print(response_raw.text)
print(response_raw.content)
Вы можете получить cookie-файл на вкладке "Сеть" консоли браузера Dev Tools в разделе "Заголовки запроса". Похоже, вы также можете получить cookie, используя библиотеку CookieJar Python.
Попробуйте передать параметр проверки как false.
request.get('https://example.com', verify=False)