2010-05-26 53 views
53

Tôi có thể làm như thế nào? Tôi đã cố gắng để nhập một số liên kết theo quy định (với urllib), nhưng để làm điều đó, tôi cần phải đăng nhậpLàm cách nào để đăng nhập vào trang web bằng Python?

Tôi có nguồn này từ trang web:.

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

Đây có phải là có thể?

Trả lời

50

Có thể bạn muốn sử dụng twill (dựa trên mechanize). Nó khá dễ sử dụng và có thể làm những gì bạn muốn.

Nó sẽ trông giống như sau:

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

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

submit('0') 

Bạn có thể sử dụng showforms() để liệt kê tất cả các hình thức một khi bạn sử dụng go(...) để duyệt đến trang web mà bạn muốn đăng nhập. Chỉ cần thử nó từ trình thông dịch python.

+0

lưu ý rằng trong một số trường hợp, bạn cần phải sử dụng gửi().xem: http://lists.idyll.org/pipermail/twill/2006-August/000526.html Tôi xác nhận vấn đề này, đối với tôi, đăng nhập vào www.pge.com, bằng cách sử dụng các công trình submit(). – user391339

+0

Có giải pháp nào cho Python 3.6 không? Dường như twill không hỗ trợ Python 3.5 cũng không 3.6. Tôi đã thử tải nó và chuyển đổi nó bằng cách sử dụng '2to3' nhưng bây giờ tôi nhận được một' ModuleNotFoundError' khi cố gắng để nhập nó. – CGFoX

+0

Thực ra, tôi có thể giải quyết 'ModuleNotFoundError' bằng cách sử dụng/chuyển đổi Twill 1.8.0 và cài đặt' lxml' và 'requests' bằng' pip install'. Nhưng bây giờ tôi nhận được một 'SyntaxError' khi tôi cố gắng nhập khẩu bởi vì một nơi nào đó' False = 0' .... – CGFoX

5

Trang web nói chung có thể kiểm tra ủy quyền theo nhiều cách khác nhau, nhưng trang web bạn đang nhắm mục tiêu dường như giúp bạn dễ dàng hợp lý hơn.

Tất cả những gì bạn cần là POST đến URL auth/login mã hóa biểu mẫu với các trường khác nhau bạn thấy ở đó (quên nhãn for, chúng được trang trí cho khách truy cập của con người). handle=whatever&password-clear=pwd và cứ tiếp tục, miễn là bạn biết các giá trị cho xử lý (email AKA) và mật khẩu bạn nên ổn.

Có lẽ POST sẽ chuyển hướng bạn đến một số trang "bạn đã đăng nhập thành công" với tiêu đề Set-Cookie xác thực phiên của bạn (hãy nhớ lưu cookie đó và gửi lại tương tác thêm trong phiên!).

14
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 

Để biết thêm thông tin xin truy cập: https://docs.python.org/2/library/urllib2.html

+0

Liên kết không hoạt động: một '2' đã được thêm vào trong url của' docs.python.org': https://docs.python.org/2/library/urllib2.html –

21

Thông thường bạn sẽ cần cookie để đăng nhập vào một trang web, có nghĩa cookielib, urllib và urllib2. Dưới đây là một lớp học mà tôi đã viết lại khi tôi đang chơi trò chơi web 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()) 

Bạn sẽ không nhất thiết cần HTTPS hoặc Chuyển xử lý, nhưng họ không bị tổn thương, và nó làm cho mở nhiều hơn nữa mạnh mẽ. Bạn cũng có thể không cần cookie, nhưng thật khó để chỉ biết từ biểu mẫu bạn đã đăng. Tôi nghi ngờ rằng bạn có thể, hoàn toàn từ đầu vào 'Nhớ tôi' đã được nhận xét.

33

Hãy để tôi cố gắng làm cho nó đơn giản, giả sử URL của trang web là www.example.com và bạn cần phải đăng ký bằng cách điền tên đăng nhập và mật khẩu, vì vậy chúng tôi đi đến trang đăng nhập nói http://www.example.com/login.php bây giờ và xem nó là mã nguồn và tìm kiếm các URL hành động nó sẽ nằm trong thẻ form giống như

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

bây giờ mất userinfo.php để làm cho URL tuyệt đối mà sẽ được 'http://example.com/userinfo.php ', bây giờ chạy một tập lệnh python đơn giản

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

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

Tôi hy vọng điều này sẽ giúp ai đó ở đâu đó một ngày nào đó.

+0

tính năng này không hoạt động đối với hầu hết của các trang web mà tôi đã thử –

+0

Trong số hai trang trợ giúp/stackoverflow tôi đã xem đây là giải pháp duy nhất hoạt động trên một trang web tôi cần. – Buoy

Các vấn đề liên quan