Как я могу войти на сайт с помощью Python?

Как мне это сделать? Я пытался ввести какую-то указанную ссылку (с 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" />

Это возможно?


person Bruno 'Shady'    schedule 26.05.2010    source источник


Ответы (7)


Возможно, вы захотите использовать twill. Он довольно прост в использовании и должен иметь возможность делать то, что вы хотите.

Это будет выглядеть следующим образом:

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

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

submit('0')

Вы можете использовать showforms() для отображения всех форм после того, как вы использовали go… для перехода на сайт, на который хотите войти. Просто попробуйте это из интерпретатора Python.

person sloth    schedule 26.05.2010
comment
обратите внимание, что в некоторых случаях вам нужно использовать submit(). см.: lists.idyll.org/pipermail/twill/2006-August/ 000526.html Я подтверждаю эту проблему, для меня вход на www.pge.com с использованием submit() работает. - person user391339; 11.09.2014
comment
Есть ли решение для Python 3.6? Похоже, twill не поддерживает Python 3.5 и 3.6. Я попытался загрузить его и преобразовать с помощью 2to3, но теперь я получаю ModuleNotFoundError при попытке импортировать его. - person CGFoX; 02.08.2017
comment
На самом деле, я мог бы решить проблему ModuleNotFoundError, используя/преобразовав Twill 1.8.0 и установив lxml и requests с pip install. Но теперь я получаю SyntaxError, когда пытаюсь импортировать, потому что где-то False = 0.... - person CGFoX; 02.08.2017
comment
Это сложно исправить, но это работает: stackoverflow.com/a/45459994/2745116 - person CGFoX; 02.08.2017
comment
Работает ли это с сайтами HTTPs или мне нужно сделать что-то вроде этого? - person Mahesha999; 12.07.2018
comment
webbot намного проще в использовании: stackoverflow.com/a/51170181/6665568 - person Natesh bhat; 04.02.2020

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

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

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

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

person Tarun Venugopal Nair    schedule 20.02.2015
comment
это не работает для большинства веб-сайтов, которые я пробовал - person Anurag Pandey; 26.08.2016
comment
Из двух десятков страниц справки/stackoverflow, которые я просмотрел, это было единственное решение, которое работало на одном сайте, который мне был нужен. - person Buoy; 19.04.2017
comment
лучшим выбором для веб-автоматизации является веб-бот. - person Natesh bhat; 08.04.2019
comment
Являются ли все значения всегда именем пользователя и паролем? Я не думаю, что это работает для выбранного мной сайта. - person Dylan Logan; 17.05.2019
comment
@DylanLogan Вам всегда нужно проверять, что реальная веб-страница отправляет на сервер, и адаптировать к ней свой сценарий. Сервер не должен различать ваш сценарий и веб-браузер. - person Jeyekomon; 12.07.2019

Как правило, для входа на сайт вам понадобятся файлы cookie, что означает cookielib, urllib и urllib2. Вот класс, который я написал, когда играл в веб-игры на Facebook:

import cookielib
import urllib
import urllib2

# set these to whatever your fb account is
fb_username = "[email protected]"
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, но это трудно сказать только по форме, которую вы разместили. Я подозреваю, что вы могли бы, просто из-за ввода «Запомнить меня», который был закомментирован.

person Anthony Briggs    schedule 26.05.2010

Автоматизация веб-страниц? Определенно веб-бот

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

Вот фрагмент :)

from webbot import Browser 
web = Browser()
web.go_to('google.com') 
web.click('Sign in')
web.type('[email protected]' , 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

person Natesh bhat    schedule 04.07.2018
comment
Этот пример отлично работает. Будет ли это работать и там, где autocomplete=off.? - person S Andrew; 27.08.2018
comment
не устанавливается на вин 64 бит. Ошибка: Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64) - person Mostafa; 27.12.2018
comment
Попробуйте использовать python3 - person Natesh bhat; 28.12.2018
comment
Как обрабатывать iframe в веб-боте?.. я имею в виду, что мне нужно закрыть iframe, который появляется после загрузки страницы.. - person arihanth jain; 01.04.2020

import cookielib
import urllib
import urllib2

url = 'http://www.someserver.com/auth/login'
values = {'email-email' : '[email protected]',
          '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

person blokeley    schedule 26.05.2010

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

Все, что вам нужно, это POST по URL-адресу auth/login закодированного формы BLOB-объекта с различными полями, которые вы там видите (забудьте о метках for, они служат украшением для посетителей-людей). handle=whatever&password-clear=pwd и т. д., если вы знаете значения дескриптора (адрес электронной почты AKA) и пароль, все должно быть в порядке.

Предположительно, POST перенаправит вас на какую-то страницу «вы успешно вошли в систему» ​​с заголовком Set-Cookie, подтверждающим ваш сеанс (обязательно сохраните этот файл cookie и отправьте его обратно при дальнейшем взаимодействии во время сеанса!).

person Alex Martelli    schedule 26.05.2010

Для HTTP текущий выбор должен быть следующим: Requests- HTTP for Humans

person Andrew_1510    schedule 15.12.2013