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?

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.


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.


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

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.


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

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


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

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


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!).


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.