Как "войти" на веб-сайт, используя модуль Python Requests?
Я пытаюсь отправить запрос для входа на сайт с использованием модуля Requests в Python, но он не работает. Я новичок в этом... поэтому я не могу понять, должен ли я делать свои файлы cookie Username и Password или какую-либо HTTP-авторизацию, которую я нашел (??).
from pyquery import PyQuery
import requests
url = 'http://www.locationary.com/home/index2.jsp'
Итак, теперь я думаю, что я должен использовать "пост" и файлы cookie...
ck = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}
r = requests.post(url, cookies=ck)
content = r.text
q = PyQuery(content)
title = q("title").text()
print title
У меня такое чувство, что я делаю файлы cookie неправильно... Я не знаю.
Если он не регистрируется правильно, заголовок домашней страницы должен появиться на "Locationary.com", и если это так, это должна быть "Домашняя страница".
Если бы вы могли бы объяснить мне несколько вещей о запросах и куках и помочь мне в этом, я был бы очень признателен.: D
Спасибо.
... Это все еще не работает. Хорошо... так вот что говорит HTML-страница домашней страницы, прежде чем вы входите в систему:
</td><td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_email.gif"> </td>
<td><input class="Data_Entry_Field_Login" type="text" name="inUserName" id="inUserName" size="25"></td>
<td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_password.gif"> </td>
<td><input class="Data_Entry_Field_Login" type="password" name="inUserPass" id="inUserPass"></td>
Итак, я думаю, что делаю все правильно, но выход по-прежнему "Locationary.com"
2nd EDIT:
Я хочу иметь возможность оставаться в системе в течение длительного времени, и всякий раз, когда я запрашиваю страницу в этом домене, я хочу, чтобы содержимое отображалось, как если бы я вошел в систему.
Ответы
Ответ 1
Если нужная информация находится на странице, на которую вы перенаправлены сразу после входа в систему...
Вместо этого давайте вызовем вашу переменную ck
payload
, как в документации по python-запросам: :
payload = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}
url = 'http://www.locationary.com/home/index2.jsp'
requests.post(url, data=payload)
Иначе...
Смотрите fooobar.com/questions/110214/... ниже.
Ответ 2
Я знаю, что вы нашли другое решение, но для таких, как я, которые находят этот вопрос, ищет то же самое, его можно достичь с помощью запросов следующим образом:
Во-первых, как сделал Маркус, проверьте источник формы входа, чтобы получить три части информации - адрес, на который отправляется форма, и атрибуты имени полей имени пользователя и пароля. В его примере они являются inUserName и inUserPass.
Как только вы получите это, вы можете использовать экземпляр requests.Session()
, чтобы сделать запрос на отправку URL-адреса входа, в котором ваши данные для входа будут полезны. Выполнение запросов из экземпляра сеанса по существу совпадает с обычными запросами, оно просто добавляет постоянство, позволяя хранить и использовать файлы cookie и т.д.
Предполагая, что попытка входа в систему прошла успешно, вы можете просто использовать экземпляр сеанса для дальнейших запросов на сайт. Куки файлы, которые идентифицируют вас, будут использоваться для авторизации запросов.
Пример
import requests
# Fill in your details here to be posted to the login form.
payload = {
'inUserName': 'username',
'inUserPass': 'password'
}
# Use 'with' to ensure the session context is closed after use.
with requests.Session() as s:
p = s.post('LOGIN_URL', data=payload)
# print the html returned or something more intelligent to see if it a successful login page.
print p.text
# An authorised request.
r = s.get('A protected web page url')
print r.text
# etc...
Ответ 3
Позвольте мне попытаться сделать это простым, предположим, что URL-адрес сайта http://example.com/ и пусть вам нужно зарегистрироваться, заполнив имя пользователя и пароль, поэтому переходим на страницу входа в систему, скажем http://example.com/login.php и просматриваем исходный код и ищем URL-адрес действия, который он будет в форме пометить что-то вроде
<form name="loginform" method="post" action="userinfo.php">
теперь возьмите userinfo.php, чтобы сделать абсолютный URL-адрес, который будет http://example.com/userinfo.php ', теперь запустить простой python script
import requests
url = 'http://example.com/userinfo.php'
values = {'username': 'user',
'password': 'pass'}
r = requests.post(url, data=values)
print r.content
Надеюсь, что это когда-нибудь поможет кому-то.
Ответ 4
Узнайте названия входов, используемых в форме веб-сайтов для имен пользователей <...name=username.../>
и паролей <...name=password../>
, и замените их в приведенном ниже сценарии. Также замените URL-адрес, чтобы он указывал на нужный сайт для входа.
login.py
#!/usr/bin/env python
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
payload = { 'username': '[email protected]', 'password': 'blahblahsecretpassw0rd' }
url = 'https://website.com/login.html'
requests.post(url, data=payload, verify=False)
Использование disable_warnings(InsecureRequestWarning)
отключит любой вывод скрипта при попытке входа на сайты с непроверенными сертификатами SSL.
Дополнительно:
Чтобы запустить этот сценарий из командной строки в системе на основе UNIX, поместите его в каталог, т.е. home/scripts
, и добавьте этот каталог в свой путь в ~/.bash_profile
или аналогичном файле, используемом терминалом.
# Custom scripts
export CUSTOM_SCRIPTS=home/scripts
export PATH=$CUSTOM_SCRIPTS:$PATH
Затем создайте ссылку на этот скрипт Python внутри home/scripts/login.py
ln -s ~/home/scripts/login.py ~/home/scripts/login
Закройте свой терминал, запустите новый, запустите login
Ответ 5
Решение requests.Session()
помогло войти в форму с защитой CSRF (как используется в формах Flask-WTF). Проверьте, требуется ли csrf_token
в качестве скрытого поля, и добавьте его в полезную нагрузку с именем пользователя и паролем:
import requests
from bs4 import BeautifulSoup
payload = {
'email': '[email protected]',
'password': 'passw0rd'
}
with requests.Session() as sess:
res = sess.get(server_name + '/signin')
signin = BeautifulSoup(res._content, 'html.parser')
payload['csrf_token'] = signin.find('input', id='csrf_token')['value']
res = sess.post(server_name + '/auth/login', data=payload)