Як "увійти" на веб-сайт за допомогою модуля запитів Python?


95

Я намагаюся опублікувати запит на вхід на веб-сайт за допомогою модуля Запити в Python, але він насправді не працює. Я новачок у цьому ... тому я не можу зрозуміти, чи слід мені робити файли cookie для мого імені користувача та пароля або якогось типу дозволу 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

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

Якщо він не входить належним чином, заголовок домашньої сторінки повинен вийти на "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- request:

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 має набагато кращу відповідь.
Katy Lavallee

228

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

По-перше, як це зробив Маркус, перевірте джерело форми входу, щоб отримати три частини інформації - 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...

12
Однак питання в тому, як отримати форму для входу в 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
приємний - зауважте, що іноді перевірка елемента поля ім'я / пропуск може виявити файл, який викликається, а не кнопку (моя просто сказала "дія" при перевірці кнопки, URL-адреса була показана з перевірки полів usr / pass)
baxx

2
Якщо ви використовуєте chrome, відкрийте devtools на вкладці мережі, і після надсилання запиту ви зможете перевірити фактичні значення, за допомогою яких ключів і куди вони були надіслані, це корисно для форм, які не використовують традиційну механіку, і замість цього використовуйте javascript / ajax для обробки форми.
Роберто Аросемена,

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

Вам потрібно буде скористатися webbrowserмодулем
R. Barrett,

Також вищезазначене 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обов’язково в якості прихованого поля, додайте його до корисного набору за допомогою імені користувача та пароля:

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.