Как «войти» на веб-сайт с помощью модуля Python Requests?


98

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

from pyquery import PyQuery
import requests

url = 'http://www.locationary.com/home/index2.jsp'

Итак, теперь я думаю, что должен использовать «почту» и куки ....

ck = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}

r = requests.post(url, cookies=ck)

content = r.text

q = PyQuery(content)

title = q("title").text()

print title

У меня такое ощущение, что я неправильно делаю с печеньем ... Не знаю.

Если он не входит в систему правильно, заголовок домашней страницы должен выходить на «Locationary.com», а если это происходит, это должно быть «Домашняя страница».

Если бы вы могли объяснить мне кое-что о запросах и файлах cookie и помочь мне в этом, я был бы очень признателен. : 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"

2-е РЕДАКТИРОВАНИЕ:

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

Ответы:


44

Если желаемая информация находится на странице, на которую вы будете перенаправлены сразу после входа в систему ...

Давайте вместо этого вызовем вашу ckпеременную payload, как в документах python-requests :

payload = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}
url = 'http://www.locationary.com/home/index2.jsp'
requests.post(url, data=payload)

В противном случае...

См. Https://stackoverflow.com/a/17633072/111362 ниже.


Я заставил его работать по-другому, используя urllib, urrlib2 и cookielib и некоторые заголовки HTTP.
Маркус Джонсон

23
К сожалению, я не могу удалить это, потому что это принятый ответ. Я не думаю, что понял вопрос, когда опубликовал это (позже он был прояснен), поэтому не уверен, почему он был принят. Мой ответ работает только в том случае, если нужные вам данные находятся на странице, на которую вы будете перенаправлены после входа в систему. У @tigerFinch есть гораздо лучший ответ.
Кэти Лавалли

230

Я знаю, что вы нашли другое решение, но для тех, кто, как я, нашел этот вопрос, ища то же самое, это может быть достигнуто с помощью следующих запросов:

Во-первых, как это сделал Маркус, проверьте источник формы входа, чтобы получить три части информации - URL-адрес, на который отправляется форма, и атрибуты имени в полях имени пользователя и пароля. В его примере это inUserName и inUserPass.

Получив это, вы можете использовать requests.Session()экземпляр для отправки почтового запроса на URL-адрес входа с вашими данными для входа в качестве полезной нагрузки. Выполнение запросов из экземпляра сеанса по сути аналогично обычному использованию запросов, оно просто добавляет постоянство, позволяя хранить и использовать файлы cookie и т. Д.

Предполагая, что ваша попытка входа в систему была успешной, вы можете просто использовать экземпляр сеанса для дальнейших запросов к сайту. 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's a successful login page.
    print p.text

    # An authorised request.
    r = s.get('A protected web page url')
    print r.text
        # etc...

13
Однако вопрос в том, как получить форму входа POST? Как я могу узнать, называется ли он inUserName, а не именем пользователя, USERNAME и т. Д.?
lsheng

4
@Twinkle посмотрите исходный код HTML для формы, чтобы узнать, как они там называются.
Аарон Шумахер

3
s.text, похоже, не работает, но я все еще даю вам некоторую любовь к голосованию за то, что вы показали мне этот прекрасный с запросами ... синтаксис
Software Prophets

s.text не работает, потому что он должен быть примерно таким: p = s.post('LOGIN_URL.....а затемp.text
Себастьян

2
@HalcyonAbrahamRamirez Я не думаю, что это подходящее место для вас, чтобы искать помощи. Я предлагаю прочитать вопрос о вашей проблеме, например: stackoverflow.com/questions/21928368/…, и если вы не можете решить его, откройте свой собственный вопрос.
Себастьян

36

Позвольте мне попытаться упростить: предположим, что 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

import requests
url = 'http://example.com/userinfo.php'
values = {'username': 'user',
          'password': 'pass'}

r = requests.post(url, data=values)
print r.content

Я надеюсь, что это когда-нибудь поможет кому-то где-нибудь.


1
приятный - обратите внимание, что иногда проверка элемента поля name / pass может выявить вызываемый файл, а не кнопку (я просто сказал 'действие' при проверке кнопки, URL-адрес был показан при проверке полей usr / pass)
baxx

2
Если вы используете Chrome, откройте инструменты разработчика на вкладке сети и после отправки запроса вы можете проверить фактические значения, с какими ключами и куда они были отправлены, это полезно для форм, которые не используют традиционную механику и вместо этого используйте javascript / ajax для обработки формы.
Роберто Аросемена

1
в этом случае есть идеи о том, как сделать так, чтобы веб-страница открывалась напрямую, а не печатала содержимое страницы?

Вам нужно будет использовать webbrowserмодуль
Р. Барретт

Также его вышеупомянутое print r.contentневерно, что он должен использоватьprint(r.content)
Р. Барретт

6

Узнайте названия входов, используемых в форме веб-сайтов для имен пользователей <...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': 'user@email.com', '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


4

requests.Session()Раствор помощь с лесозаготовками в форму с защитой CSRF (как это используется в Колба-ВТФ формах). Проверьте csrf_token, требуется ли a как скрытое поле, и добавьте его в полезную нагрузку, указав имя пользователя и пароль:

import requests
from bs4 import BeautifulSoup

payload = {
    'email': 'email@example.com',
    '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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.