Как я могу войти на сайт с помощью 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 02

На самом деле, я мог решить эту проблему ModuleNotFoundError, используя / преобразовав Twill 1.8.0 и установив lxmlи requestsс pip install. Но теперь я получаю, SyntaxErrorкогда пытаюсь импортировать, потому что где-то False = 0....
CGFoX 02


Работает ли он с 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
Натеш бхат 08

Все ли значения всегда имя пользователя и пароль? Я не думаю, что это работает для выбранного мной сайта.
Дилан Логан

@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.


Ссылка не работает: 2в docs.python.orgURL- адресах
Майкл Копп

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)
Мостафа

Попробуйте использовать python3
Natesh bhat

Как обрабатывать iframe в веб-ботах? .. Я имею в виду, что мне нужно закрыть iframe, который всплывает после загрузки страницы ..
Арихант Джайн,

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.