Bagaimana saya bisa masuk ke situs web dengan Python?

88

Bagaimana saya bisa melakukannya? Saya mencoba memasukkan beberapa tautan yang ditentukan (dengan urllib), tetapi untuk melakukannya, saya harus masuk.

Saya memiliki sumber ini dari situs:

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

Apakah ini mungkin?

Bruno 'Shady'
sumber

Jawaban:

70

Mungkin Anda ingin menggunakan twill . Ini cukup mudah digunakan dan harus dapat melakukan apa yang Anda inginkan.

Ini akan terlihat seperti berikut:

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

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

submit('0')

Anda dapat menggunakan showforms()untuk mendaftar semua formulir setelah Anda biasa go…menelusuri situs yang ingin Anda masuki. Coba saja dari interpreter python.

kemalasan
sumber
perhatikan bahwa dalam beberapa kasus Anda perlu menggunakan submit (). lihat: lists.idyll.org/pipermail/twill/2006-August/000526.html Saya mengonfirmasi masalah ini, untuk saya, masuk ke www.pge.com, menggunakan karya submit ().
pengguna391339
2
Apakah ada solusi untuk Python 3.6? Sepertinya twill tidak mendukung Python 3.5 atau 3.6. Saya mencoba mengunduhnya dan mengonversinya menggunakan 2to3tetapi sekarang saya mendapatkan ModuleNotFoundErrorketika mencoba untuk mengimpornya.
CGFoX
Sebenarnya, saya bisa menyelesaikannya ModuleNotFoundErrordengan menggunakan / mengubah Twill 1.8.0 dan menginstal lxmldan requestsdengan pip install. Tapi sekarang saya mendapatkan SyntaxErrorketika saya mencoba untuk mengimpor karena di suatu tempat False = 0....
CGFoX
2
Agak
merepotkan
Apakah ini berfungsi dengan situs HTTPs atau saya harus melakukan sesuatu seperti ini ?
Mahesha999
53

Biarkan saya mencoba membuatnya sederhana, misalkan URL situsnya adalah www.example.com dan Anda perlu mendaftar dengan mengisi nama pengguna dan kata sandi, jadi kita pergi ke halaman login katakan http://www.example.com/login .php sekarang dan lihat kode sumbernya dan cari URL tindakan itu akan dalam bentuk tag seperti

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

sekarang ambil userinfo.php untuk membuat URL absolut yang akan menjadi ' http://example.com/userinfo.php ', sekarang jalankan skrip python sederhana

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

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

Saya harap ini membantu seseorang suatu hari nanti.

Tarun Venugopal Nair
sumber
ini tidak berfungsi untuk sebagian besar situs web yang saya coba
Anurag Pandey
Dari dua lusin halaman bantuan / stackoverflow yang saya lihat, ini adalah satu-satunya solusi yang berfungsi di satu situs yang saya butuhkan.
Pelampung
pilihan terbaik untuk otomatisasi web adalah webbot. stackoverflow.com/a/51170181/6665568
Natesh bhat
Apakah semua nilai selalu nama pengguna & kata sandi? Sepertinya ini tidak berfungsi untuk situs pilihan saya.
Dylan Logan
@DylanLogan Anda selalu harus memeriksa apa yang dikirim halaman web aktual ke server dan menyesuaikan skrip Anda dengannya. Server tidak boleh membedakan antara skrip Anda dan browser web.
Jeyekomon
28

Biasanya Anda memerlukan cookie untuk masuk ke situs, yang berarti cookielib, urllib, dan urllib2. Ini adalah kelas yang saya tulis kembali ketika saya bermain game 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())

Anda tidak membutuhkan HTTPS atau Redirect handler, tetapi tidak merugikan, dan itu membuat pembuka jauh lebih kuat. Anda juga mungkin tidak memerlukan cookie, tetapi sulit untuk membedakannya hanya dari formulir yang Anda posting. Saya menduga Anda mungkin, murni dari masukan 'Ingat saya' yang telah dikomentari.

Anthony Briggs
sumber
19
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

Untuk informasi lebih lanjut kunjungi: https://docs.python.org/2/library/urllib2.html

blokeley
sumber
Tautan tidak berfungsi: a 2telah ditambahkan di docs.python.orgurl: docs.python.org/2/library/urllib2.html
Michael Kopp
18

Otomatisasi halaman web? Pasti "webbot"

webbot bahkan berfungsi halaman web yang secara dinamis mengubah id dan nama kelas dan memiliki lebih banyak metode dan fitur daripada selenium atau mekanik.

Ini cuplikannya :)

from webbot import Browser 
web = Browser()
web.go_to('google.com') 
web.click('Sign in')
web.type('[email protected]' , 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 ^_^

Dokumennya juga cukup sederhana dan mudah digunakan: https://webbot.readthedocs.io

Natesh bhat
sumber
Ujian ini bekerja dengan baik. Apakah ini juga akan berhasil di mana autocomplete=off.?
S Andrew
tidak diinstal pada win 64 bit. Kesalahan:Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64)
Mostafa
Coba gunakan python3
Natesh bhat
Bagaimana menangani iframe di webbot.?..saya maksud saya harus menutup iframe yang muncul setelah halaman dimuat ..
arihanth jain
7

Situs web pada umumnya dapat memeriksa otorisasi dengan berbagai cara, tetapi cara yang Anda targetkan tampaknya cukup memudahkan Anda.

Yang Anda butuhkan adalah untuk POSTke auth/loginURL gumpalan bentuk-dikodekan dengan berbagai bidang yang Anda lihat di sana (lupa label for, mereka dekorasi sedang untuk pengunjung manusia). handle=whatever&password-clear=pwddan seterusnya, selama Anda tahu nilai untuk pegangan (email AKA) dan kata sandi Anda harus baik-baik saja.

Agaknya POST akan mengarahkan Anda ke beberapa halaman "Anda telah berhasil login" dengan Set-Cookieheader yang memvalidasi sesi Anda (pastikan untuk menyimpan cookie itu dan mengirimkannya kembali pada interaksi lebih lanjut sepanjang sesi!).

Alex Martelli
sumber