Как запросы. Сессия (). Получить, если веб-сайт не держит меня в системе? - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь завершить создание веб-страницы, которая сначала требует входа в систему. Я совершенно уверен, что у меня правильный код и входные имена («логин» и «пароль»), но это все равно дает мне страницу «Ошибка входа». Вот мой код:

payload = {'login': 'MY_USERNAME', 'password': 'MY_PASSWORD'}
login_url = "https://www.spatialgroup.com.au/property_daily/"

with requests.Session() as session:

    session.post(login_url, data=payload)
    response = session.get("https://www.spatialgroup.com.au/cgi-bin/login.cgi")
    html = response.text

print(html)

Я немного покопался и понял, что сессия не остается в системе, когда я запускаю свой session.get ("LOGGEDIN_PAGE"). Например, если я завершу процесс входа в систему и затем введу в адресную строку URL, который, как я знаю, является страницей, доступной только после входа в систему, он возвращает меня на страницу «Ошибка входа». Как бы мне обойти это, если мой сеанс входа не поддерживается?

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Как уже упоминали другие, здесь трудно помочь, не зная фактического сайта, на который вы пытаетесь войти.

Я бы отметил, что вы вообще не используете никаких установленных заголовков 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
0 голосов
/ 04 июня 2019

Очень трудно помочь вам, не имея реального веб-сайта, с которым вы работаете.При этом я бы порекомендовал вам изменить эту строку:

session.post(login_url, data=payload)

на эту:

session.post(login_url, json=payload)

надеюсь, это поможет

...