Python ile bir web sitesine nasıl giriş yapabilirim?


88

Nasıl yapabilirim? Belirli bir bağlantı girmeye çalışıyordum (urllib ile), ancak bunu yapmak için giriş yapmam gerekiyor.

Bu kaynağı siteden aldım:

<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" />

Mümkün mü?

Yanıtlar:


70

Belki dimi kullanmak istersiniz . Kullanımı oldukça kolaydır ve istediğinizi yapabilmeli.

Aşağıdaki gibi görünecek:

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

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

submit('0')

Giriş yapmak istediğiniz siteye göz atarken showforms()tüm formları listelemek için kullanabilirsiniz go…. Sadece python yorumlayıcısından deneyin.


bazı durumlarda submit () kullanmanız gerektiğini unutmayın. bkz: lists.idyll.org/pipermail/twill/2006-August/000526.html Bu sorunu kendim için, submit () works kullanarak www.pge.com'da oturum açarak onaylıyorum.
user391339

2
Python 3.6 için bir çözüm var mı? Görünüşe göre dimi Python 3.5 veya 3.6'yı desteklemiyor. İndirmeyi ve kullanarak dönüştürmeyi denedim 2to3ama şimdi içeri ModuleNotFoundErroraktarmaya çalışırken bir alıyorum .
CGFoX

Aslında, ModuleNotFoundErrorTwill 1.8.0'ı kullanarak / dönüştürerek ve yükleyerek lxmlve requestsile çözebilirim pip install. Ama şimdi SyntaxErroriçe False = 0
aktarmayı

2
Düzeltmek biraz zor ama işe yarıyor: stackoverflow.com/a/45459994/2745116
CGFoX

O sitelerin HTTPS ile çalışmak ya da ben böyle bir şey yapmak zorunda mı bu ?
Mahesha999

53

Basitleştirmeye çalışayım, sitenin URL'sinin www.example.com olduğunu ve kullanıcı adı ve şifreyi girerek kaydolmanız gerektiğini varsayalım, bu yüzden http://www.example.com/login deyin ki giriş sayfasına gidiyoruz .php şimdi ve kaynak kodunu görüntüleyin ve eylem URL'sini arayın, form etiketinde olduğu gibi

 <form name="loginform" method="post" action="userinfo.php">

şimdi ' http://example.com/userinfo.php ' olacak mutlak URL yapmak için userinfo.php'yi alın , şimdi basit bir python betiği çalıştırın

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

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

Umarım bu bir gün birine yardımcı olur.


bu, denediğim web sitelerinin çoğu için çalışmıyor
Anurag Pandey

Baktığım iki düzine yardım / stackoverflow sayfasından ihtiyacım olan tek sitede işe yarayan tek çözüm buydu.
Şamandıra

web otomasyonu için en iyi seçenek webbottur. stackoverflow.com/a/51170181/6665568
Natesh bhat

Tüm değerler her zaman kullanıcı adı ve şifre midir? Bunun seçtiğim site için çalıştığını sanmıyorum.
Dylan Logan

@DylanLogan Her zaman gerçek web sayfasının sunucuya ne gönderdiğini incelemeniz ve betiğinizi buna uyarlamanız gerekir. Sunucu, komut diziniz ile web tarayıcısını ayırt edememelidir.
Jeyekomon

28

Tipik olarak bir siteye giriş yapmak için çerezlere ihtiyacınız olacaktır, bu da cookielib, urllib ve urllib2 anlamına gelir. İşte Facebook web oyunları oynarken yazdığım bir sınıf:

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 veya Yönlendirme işleyicilerine mutlaka ihtiyacınız olmayacak, ancak zarar vermiyorlar ve açıcıyı çok daha sağlam hale getiriyor. Çerezlere de ihtiyacınız olmayabilir, ancak yalnızca gönderdiğiniz formdan bunu söylemek zor. Tamamen yorumlanmış olan 'Beni hatırla' girişinden olabileceğinizden şüpheleniyorum.


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

Daha fazla bilgi için şu adresi ziyaret edin: https://docs.python.org/2/library/urllib2.html


Bağlantı çalışmıyor: url'lere bir 2eklendi docs.python.org: docs.python.org/2/library/urllib2.html
Michael Kopp

18

Web sayfası otomasyonu? Kesinlikle "webbot"

webbot dinamik olarak değişen id ve sınıf adlarına sahip ve selenyum veya mekanize etmekten daha fazla yöntem ve özelliğe sahip web sayfalarında bile çalışır.

İşte bir pasaj :)

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 ^_^

Belgeler de oldukça basit ve kullanımı basit: https://webbot.readthedocs.io


Bu sınav harika çalışıyor. Bu da nerede çalışacak autocomplete=off?
S Andrew

64 bit kazanmak üzerine yüklenmez. Hata:Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64)
Mostafa

Python3
Natesh bhat

Webbot'ta iframe nasıl kullanılır? ... bu, sayfa yüklendikten sonra açılan bir iframe'i kapatmam gerektiği anlamına geliyor ..
arihanth jain

7

Genel olarak web siteleri yetkilendirmeyi birçok farklı şekilde kontrol edebilir, ancak hedeflediğiniz web siteleri bunu sizin için makul ölçüde kolaylaştırıyor gibi görünüyor.

İhtiyacınız olan tek POSTşey, auth/loginURL'ye, orada gördüğünüz çeşitli alanlara sahip form kodlu bir blob sağlamaktır (etiketleri unutun for, bunlar insan ziyaretçiler için dekorasyon). handle=whatever&password-clear=pwdve benzeri, tanıtıcı (AKA e-postası) ve şifre değerlerini bildiğiniz sürece sorun yaşamazsınız.

Muhtemelen POST sizi Set-Cookie, oturumunuzu doğrulayan bir başlık içeren bir "başarıyla oturum açtınız" sayfasına yönlendirecektir (bu çerezi kaydettiğinizden ve oturum boyunca daha fazla etkileşimde geri gönderdiğinizden emin olun!).


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.