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


87

Як я можу це зробити? Я намагався ввести якесь вказане посилання (за допомогою urllib), але для цього мені потрібно увійти.

У мене це джерело з сайту:

<form id="login-form" action="auth/login" method="post">
    <div>
    <!--label for="rememberme">Remember me</label><input type="checkbox" class="remember" checked="checked" name="remember me" /-->
    <label for="email" id="email-label" class="no-js">Email</label>
    <input id="email-email" type="text" name="handle" value="" autocomplete="off" />
    <label for="combination" id="combo-label" class="no-js">Combination</label>
    <input id="password-clear" type="text" value="Combination" autocomplete="off" />
    <input id="password-password" type="password" name="password" value="" autocomplete="off" />
    <input id="sumbitLogin" class="signin" type="submit" value="Sign In" />

Чи можливо це?

Відповіді:


70

Можливо, ви хочете використовувати саржі . Він досить простий у використанні і повинен мати можливість робити те, що ви хочете.

Це буде виглядати наступним чином:

from twill.commands import *
go('http://example.org')

fv("1", "email-email", "blabla.com")
fv("1", "password-clear", "testpass")

submit('0')

Ви можете використовувати showforms()для перерахування всіх форм, коли ви go…переходили на сайт, на який ви хочете увійти. Просто спробуйте це з інтерпретатора python.


зауважте, що в деяких випадках вам потрібно використовувати submit (). див.: lists.idyll.org/pipermail/twill/2006-August/000526.html Я підтверджую цю проблему для себе, увійшовши на www.pge.com, використовуючи роботи submit ().
user391339

2
Чи є рішення для Python 3.6? Здається, саржа не підтримує Python 3.5 або 3.6. Я спробував завантажити його та перетворити за допомогою, 2to3але тепер я отримую ModuleNotFoundErrorпри спробі імпортувати його.
CGFoX

На самом деле, я міг би дозволити ModuleNotFoundErrorза допомогою / перетворення саржа 1.8.0 і установка lxmlі requestsз pip install. Але зараз я отримую, SyntaxErrorколи намагаюся імпортувати, бо десь False = 0....
CGFoX

2
Це свого роду біль , щоб виправити це, але це працює: stackoverflow.com/a/45459994/2745116
CGFoX

Чи працює він з HTTPs сайтів або я повинен зробити що - щось на зразок цього ?
Mahesha999

51

Дозвольте мені спробувати спростити, припустимо, що URL-адреса сайту - www.example.com, і вам потрібно зареєструватися, заповнивши ім'я користувача та пароль, тому ми переходимо на сторінку входу, скажімо http://www.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

Я сподіваюся, що це колись колись десь допоможе.


це не працює для більшості веб-сайтів, які я пробував
Анураг Панді

З двох десятків сторінок довідки / stackoverflow, які я переглянув, це було єдиним рішенням, яке працювало на одному веб-сайті, який мені потрібен.
Буй

найкращий вибір для веб-автоматизації - веб-робот. stackoverflow.com/a/51170181/6665568
Natesh Бхат

Чи завжди всі значення ім’я користувача та пароль? Я не думаю, що це, здається, працює для обраного вами сайту.
Ділан Логан,

@DylanLogan Вам завжди потрібно перевіряти, що фактична веб-сторінка надсилає на сервер, і адаптувати свій сценарій до нього. Сервер не повинен розрізняти ваш сценарій та веб-браузер.
Jeyekomon

28

Зазвичай вам потрібні файли cookie для входу на сайт, що означає cookielib, urllib та urllib2. Ось клас, який я написав, коли грав у веб-ігри Facebook:

import cookielib
import urllib
import urllib2

# set these to whatever your fb account is
fb_username = "your@facebook.login"
fb_password = "secretpassword"

class WebGamePlayer(object):

    def __init__(self, login, password):
        """ Start up... """
        self.login = login
        self.password = password

        self.cj = cookielib.CookieJar()
        self.opener = urllib2.build_opener(
            urllib2.HTTPRedirectHandler(),
            urllib2.HTTPHandler(debuglevel=0),
            urllib2.HTTPSHandler(debuglevel=0),
            urllib2.HTTPCookieProcessor(self.cj)
        )
        self.opener.addheaders = [
            ('User-agent', ('Mozilla/4.0 (compatible; MSIE 6.0; '
                           'Windows NT 5.2; .NET CLR 1.1.4322)'))
        ]

        # need this twice - once to set cookies, once to log in...
        self.loginToFacebook()
        self.loginToFacebook()

    def loginToFacebook(self):
        """
        Handle login. This should populate our cookie jar.
        """
        login_data = urllib.urlencode({
            'email' : self.login,
            'pass' : self.password,
        })
        response = self.opener.open("https://login.facebook.com/login.php", login_data)
        return ''.join(response.readlines())

Вам не обов'язково знадобляться обробники HTTPS або Redirect, але вони не шкодять, і це робить сошник набагато надійнішим. Вам також можуть не знадобитися файли cookie, але важко визначити лише за формою, яку ви опублікували. Я підозрюю, що ви могли б, суто з введеного коментаря "Запам’ятати мене".


19
import cookielib
import urllib
import urllib2

url = 'http://www.someserver.com/auth/login'
values = {'email-email' : 'john@example.com',
          'password-clear' : 'Combination',
          'password-password' : 'mypassword' }

data = urllib.urlencode(values)
cookies = cookielib.CookieJar()

opener = urllib2.build_opener(
    urllib2.HTTPRedirectHandler(),
    urllib2.HTTPHandler(debuglevel=0),
    urllib2.HTTPSHandler(debuglevel=0),
    urllib2.HTTPCookieProcessor(cookies))

response = opener.open(url, data)
the_page = response.read()
http_headers = response.info()
# The login cookies should be contained in the cookies variable

Для отримання додаткової інформації відвідайте: https://docs.python.org/2/library/urllib2.html


Посилання не працює: a 2додано в docs.python.orgURL-адреси: docs.python.org/2/library/urllib2.html
Майкл Копп

18

Автоматизація веб-сторінок? Безумовно "веб-робот"

webbot навіть працює веб-сторінки, які динамічно змінюють ідентифікатори та імена класів, і має більше методів та функцій, ніж селен або механізація.

Ось фрагмент :)

from webbot import Browser 
web = Browser()
web.go_to('google.com') 
web.click('Sign in')
web.type('mymail@gmail.com' , into='Email')
web.click('NEXT' , tag='span')
web.type('mypassword' , into='Password' , id='passwordFieldId') # specific selection
web.click('NEXT' , tag='span') # you are logged in ^_^

Документи також досить прямі та прості у використанні: https://webbot.readthedocs.io


Цей екзамен чудово працює. Чи це також спрацює autocomplete=off?
S Andrew

не встановлювати на win 64 bit. Помилка:Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64)
Mostafa

Спробуйте використати python3
Natesh bhat

Як впоратися з IFRAME в webbot.?..i означає , що я повинен закрити IFRAME , який спливаючі вікна після завантаження сторінки ..
arihanth джайнов

7

Взагалі веб-сайти можуть перевіряти авторизацію різними способами, але той, на який ви націлюєтесь, полегшує вам роботу.

Все, що вам потрібно, - це перейти POSTдо auth/loginURL-адреси зашифровану форму форми з різними полями, які ви бачите там (забудьте мітки for, вони є прикрасою для відвідувачів). handle=whatever&password-clear=pwdі так далі, поки ви знаєте значення дескриптора (AKA електронної пошти) та пароля, у вас все буде в порядку.

Імовірно, POST перенаправить вас на якусь сторінку "Ви успішно увійшли" із Set-Cookieзаголовком, що підтверджує ваш сеанс (обов'язково збережіть цей файл cookie та надішліть його назад для подальшої взаємодії протягом сеансу!).


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.