Как уже упоминали другие, здесь трудно помочь, не зная фактического сайта, на который вы пытаетесь войти.
Я бы отметил, что вы вообще не используете никаких установленных заголовков HTTP, что является обычной проверкой правильности входа в систему на веб-страницах. Если вы уверены, что вы размещаете данные в правильном формате (форма, закодированная по сравнению с кодировкой json), я бы открыл Chrome инспектор и скопировал пользовательский агент из вашего браузера.
s = requests.Session()
s.headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
'Accept': '*/*'
}
Кроме того, рекомендуется проверять код состояния ответа на каждый веб-запрос, который вы делаете, используя шаблон try / исключением. Это поможет вам отлавливать ошибки при написании и тестировании запросов, а не слепо угадывать, какие запросы ошибочны.
r = requests.get('http://mypage.com')
try:
r.raise_for_status()
except requests.exceptions.HTTPError:
print('oops bad status code {} on request!'.format(r.status_code))
Редактировать: Теперь, когда вы предоставили нам сайт, проверка попытки входа в систему показывает, что данные формы фактически не размещаются на этом веб-сайте, а отправляются на URL-адрес сценария CGI. .
Чтобы найти это, откройте Chrome Inspector и просмотрите вкладку «Сеть» при попытке входа в систему. Вы увидите, что логин на самом деле отправляется на https://www.spatialgroup.com.au/cgi-bin/login.cgi
, а не на настоящую страницу логина. Когда вы отправляете на эту страницу входа в систему, она выполняет перенаправление 302 после входа в систему. Мы можем проверить местоположение после выполнения запроса, чтобы увидеть, если вход был успешным.
Зная это, я бы отправил запрос вот так:
s = requests.Session()
# try to login
r = s.post(
url='https://www.spatialgroup.com.au/cgi-bin/login.cgi',
headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3'
},
data={
'login': USERNAME,
'password': PASSWORD
}
)
# now lets check to make sure we didnt get 4XX or 5XX errors
try:
r.raise_for_status()
except requests.exceptions.HTTPError:
print('oops bad status code {} on request!'.format(r.status_code))
else:
print('our login redirected to: {}'.format(r.url))
# subsequently if the login was successful, you can now make a request to the login-protected page at this point