2010-05-26 19 views
53

Nasıl yapabilirim? I (urllib ile) bazı Belirtilen bağlantı girmek için çalışıyordu, ama bunu yapmak için, ben giriş yapmanız gerekir Python ile bir web sitesine nasıl giriş yapabilirim?

ben sitesinden bu kaynağı vardır:. Bu mümkün 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" /> 

?

cevap

50

Belki twill (mechanize tabanlı) kullanmak istiyorsunuz. Kullanımı oldukça kolaydır ve istediğiniz şeyi yapabilmelidir.

Aşağıdaki gibi görünecektir: Eğer giriş yapmak için istediğiniz siteye göz atmak için go(...) kullanılan bir kez tüm formlarını listelemek için showforms() kullanabilirsiniz

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

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

submit('0') 

. Sadece python yorumlayıcısından deneyin. Daha fazla bilgi için

+0

Bazı durumlarda, submit() öğesini kullanmanız gerektiğini unutmayın.see: http://lists.idyll.org/pipermail/twill/2006-August/000526.html Bu sorunu onaylıyorum, benim için, www.pge.com adresine giriş yaparak, submit() eserleri kullanarak. – user391339

+0

Python 3.6 için bir çözüm var mı? Dimi, Python 3.5 ve 3.6'yı desteklemiyor gibi görünüyor. İndirmeyi denedim ve '2to3' kullanarak onu dönüştürmeyi denedim ama şimdi onu almaya çalışırken bir' ModuleNotFoundError' aldım. – CGFoX

+0

Aslında, 'ModuleNotFoundError', Twill 1.8.0'ı kullanarak/dönüştürerek ve 'lxml' ve' request' '' pip install' ile yükleyerek çözebilirim. Ama şimdi bir "SyntaxError" aldığımda, bir yere "False = 0" olduğu için almayı denedim .... – CGFoX

5

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

Tek ihtiyacınız (insan ziyaretçiler için dekorasyon konum etiketleri for unutma) burada gördüğünüz çeşitli alanlarda bir form olarak kodlanmış damla auth/login URL'ye POST etmektir. handle=whatever&password-clear=pwd ve benzeri, sap (AKA e-posta) ve şifre için değerleri bildiğiniz sürece iyi olmalıdır.

Muhtemelen POST, oturumunuzu doğrulayan bir Set-Cookie başlığı ile "başarıyla giriş yapmış olduğunuz" sayfaya yönlendirecektir (bu çerezi sakladığınızdan emin olun ve oturum boyunca daha fazla etkileşime geri gönderin!).

14
import cookielib 
import urllib 
import urllib2 

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

+0

Bağlantı çalışmıyor: "docs.python.org" URL'lerine bir '2' eklendi: https://docs.python.org/2/library/urllib2.html –

21

Genelde cookielib, urllib ve urllib2 anlamına gelen bir sitede, oturum çerezleri gerekir. İşte Facebook web oyunları oynarken geri yazdığım bir sınıf var:

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()) 

Mutlaka HTTPS ihtiyaç veya işleyicileri yönlendir olmayacak, ama onlar zarar yoktur ve bunun açıcı çok daha sağlam hale getirir. Ayrıca, çerezlere de ihtiyacınız olmayabilir, ancak gönderdiğiniz formdan hemen söylemek zor. Sadece 'Beni hatırla' girişinden yorumlanabileceğinden şüpheleniyorum. HTTP şeyler için

33

beni basit hale getirmek için çalışalım, sitenin varsayalım URL www.example.com ise ve kullanıcı adı ve parola doldurarak kaydolmak gerekir, bu yüzden şimdi 'http://example.com/userinfo.php olacak mutlak URL yapmak userinfo.php almak o

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

gibi form etiketi şey olacak şimdi http://www.example.com/login.php söyledikleriniz ve kaynak kod görüntülemek ve eylem URL için arama oturum açma sayfasına gitmek ', ş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 bir yerlere yardımcı olur.

+0

bu çoğu için işe yaramıyor Ben denedim web siteleri –

+0

Bu baktım iki düzine yardım/stackoverflow sayfaları dışında ben gereken tek sitede çalışan tek çözüm oldu. – Buoy