Làm cách nào để đăng nhập vào một trang web bằng Python?


87

Tôi làm nó như thế nào? Tôi đã cố gắng nhập một số liên kết được chỉ định (với urllib), nhưng để thực hiện, tôi cần đăng nhập.

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

Điều này có khả thi không?

Câu trả lời:


70

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

Nó sẽ giống như sau:

from twill.commands import *
go('http://example.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 biểu mẫu khi bạn đã sử dụng go…để duyệt đến trang web bạn muốn đăng nhập. Chỉ cần thử nó từ trình thông dịch python.


lưu ý rằng trong một số trường hợp, bạn cần sử dụng submit (). xem : ists.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, sử dụng submit () hoạt động.
user391339

2
Có giải pháp nào cho Python 3.6 không? Có vẻ như twill không hỗ trợ Python 3.5 hay 3.6. Tôi đã thử tải xuống và chuyển đổi nó bằng cách sử dụng 2to3nhưng bây giờ tôi gặp lỗi ModuleNotFoundErrorkhi cố gắng nhập nó.
CGFoX

Trên thực tế, tôi có thể giải quyết ModuleNotFoundErrorbằng cách sử dụng / chuyển đổi Twill 1.8.0 và cài đặt lxmlrequestsvới pip install. Nhưng bây giờ tôi nhận được một SyntaxErrorkhi tôi cố gắng nhập khẩu vì ở đâu đó False = 0....
CGFoX

2
Đó là loại một nỗi đau để sửa chữa nó, nhưng nó hoạt động: stackoverflow.com/a/45459994/2745116
CGFoX

Nó có hoạt động với các trang web HTTP hay tôi phải làm điều gì đó như thế này ?
Mahesha999

51

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 đăng ký bằng cách điền tên người dùng và mật khẩu, vì vậy chúng tôi chuyển đến trang đăng nhập, nói http://www.example.com/login .php ngay bây giờ và xem mã nguồn của nó và tìm kiếm URL hành động, nó sẽ ở dạng thẻ biểu mẫu giống như

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

bây giờ sử dụng userinfo.php để tạo URL tuyệt đối sẽ là ' http://example.com/userinfo.php ', bây giờ hãy 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 rằng điều này sẽ giúp ai đó ở đâu đó vào một ngày nào đó.


này không làm việc cho hầu hết các trang web mà tôi đã cố gắng
Anurag Pandey

Trong số hai chục 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 mà tôi cần.
Phao

lựa chọn tốt nhất cho tự động hóa web là webbot. stackoverflow.com/a/51170181/6665568
Natesh bhat

Có phải tất cả các giá trị luôn là tên người dùng và mật khẩu? Tôi không nghĩ rằng điều này dường như đang hoạt động cho trang web đã chọn của tôi.
Dylan Logan

@DylanLogan Bạn luôn phải kiểm tra những gì trang web thực tế gửi đến máy chủ và điều chỉnh tập lệnh của bạn cho phù hợp. Máy chủ sẽ không thể phân biệt giữa tập lệnh của bạn và trình duyệt web.
Jeyekomon

28

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

Bạn sẽ không nhất thiết phải cần đến các trình xử lý HTTPS hoặc Redirect, nhưng chúng không gây hại và nó làm cho trình mở trở nên mạnh mẽ hơn nhiều. Bạn cũng có thể không cần cookie, nhưng thật khó để biết chỉ từ biểu mẫu mà bạn đã đăng. Tôi nghi ngờ rằng bạn có thể, hoàn toàn từ đầu vào 'Nhớ thông tin đăng nhập của tôi' đã được nhận xét.


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

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


Liên kết không hoạt động: a 2đã được thêm vào docs.python.orgurl: docs.python.org/2/library/urllib2.html
Michael Kopp,

18

Tự động hóa trang web? Chắc chắn là "webbot"

webbot thậm chí hoạt động trên các trang web có id và tên lớp thay đổi động và có nhiều phương thức và tính năng hơn so với selen hoặc cơ khí hóa.

Đây là một đoạn mã :)

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

Tài liệu cũng khá đơn giản và dễ sử dụng: https://webbot.readthedocs.io


Examlpe này hoạt động tuyệt vời. Điều này cũng sẽ hoạt động ở đâu autocomplete=off.?
S Andrew

không cài được trên win 64 bit. Lỗi:Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64)
Mostafa

Hãy thử sử dụng python3
Natesh Bhat

Cách xử lý iframe trong webbot.? .. ý tôi là tôi phải đóng iframe bật lên sau khi tải trang ..
arihanth jain

7

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

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

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.