Вход в систему с использованием request.post приводит к «Ошибка 405 не допускается» - PullRequest
0 голосов
/ 11 июня 2018

Моя цель - очистить данные с consumerreports.com, поэтому я использую «запросы» и «Beautifulsoup» для этого проекта.Если оставить в стороне, у меня много проблем с успешным входом на customerreports.com через запросы.

Вот мой код: я создал два текстовых файла, в которых я пишу сообщение и ответ, чтобы я мог проверить, успешно ли он вошел в систему.

import requests
import os.path

#declares any necessary variables
#file1, file2 to check if login is successful

save_path = '/Users/myName/Documents/Webscraping Project/'
login_url = 'https://www.consumerreports.org/cro/index.htm'
my_url = 'https://www.consumerreports.org/cro/index.htm'
pName = os.path.join(save_path, 'post text file'+".txt")
rName = os.path.join(save_path, 'response text file'+".txt")
post_file = open(pName, "w")
response_file = open(rName, "w")

#login using Session class from Requests package
with requests.Session() as s:

    payload = {"userName":"myName@university.edu","password":"my_password"}
    p = s.post(login_url, data=payload)
    print(p.text)

    r = s.get(my_url)

    #saves files to see if login was successful

    post_file.write(str(p.text.encode('utf-8')))
    response_file.write(str(r.text.encode('utf-8')))
post_file.close()
response_file.close()


print('Files created.')

Вот что я получил:

<!DOCTYPE html>
<html>
  <head>
    <title>405 Not allowed.</title>
  </head>
  <body>
    <h1>Error 405 Not allowed.</h1>
    <p>Not allowed.</p>
    <h3>Guru Meditation:</h3>
    <p>XID: #some number </p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>

Кроме того, я проверил содержимое файла ответа text.txt и через базовую функцию ctrl + f смог определить, что система не успешно вошла в систему.

Кажется, что веб-сервер не принимает метод 'post', по крайней мере для этого конкретного URL, и именно поэтому он возвращает ошибку.Однако я не знаю, как действовать дальше.Я посмотрел в Интернете, и кто-то предложил использовать

response = requests.get(login_url, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'})

, чтобы создать пользовательский агент для входа в систему или что-то еще.Я все еще довольно плохо знаком с Python, поэтому любые советы будут оценены.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Возможно, вам понадобится добавить заголовки в s.post Существует решение этой ошибки здесь .Это сработало для меня.Надеюсь, это поможет.

0 голосов
/ 11 июня 2018

Причиной этого является то, что форма входа создается с помощью javascript.Поскольку форма входа добавляется в DOM в результате события щелчка, она не существует, когда вы выполняете запрос.Все запросы - это существующий контент со страницы.Если URL-адрес изменился, отражая состояние (отображая форму входа в систему), то вы можете использовать это, но это не так.

Что вам нужно сделать, это использовать браузер без головы (Chrome или Firefox в без головы)режим) в сочетании с библиотекой, как Selenium.Вы можете загрузить сайт в автономный браузер и написать код, используя Selenium для взаимодействия с ним.Однако это значительно сложнее реализовать.

...