PythonでWebサイトにログインするにはどうすればよいですか?


88

どうすればいいですか?指定されたリンク(urllibを使用)を入力しようとしましたが、そのためにはログインする必要があります。

私はサイトからこのソースを持っています:

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

これは可能ですか?

回答:


70

ツイルを使いたいかもしれません。使い方はとても簡単で、やりたいことができるはずです。

次のようになります。

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

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

submit('0')

ログインしたいサイトを閲覧した後は、showforms()を使用go…してすべてのフォームを一覧表示できます。Pythonインタープリターから試してみてください。


場合によっては、submit()を使用する必要があることに注意してください。参照: lists.idyll.org/pipermail/twill/2006-August/000526.html この問題を確認しました。submit()を使用してwww.pge.comにログインします。
user391339 2014

2
Python 3.6の解決策はありますか?ツイルはPython3.5も3.6もサポートしていないようです。ダウンロードして変換してみました2to3ModuleNotFoundError、インポートしようとするとが表示されます。
CGFoX 2017

実際、ModuleNotFoundErrorTwill 1.8.0を使用/変換し、をインストールしてlxmlrequestsを使用することで解決できましたpip install。しかしSyntaxError、どこかでインポートしようとすると、今はが表示されFalse = 0ます....
CGFoX 2017

2
それを修正するのは
ちょっと面倒

HTTPサイトで動作しますか、それともこのようなことをする必要がありますか?
Mahesha999 2018

53

簡単に説明します。サイトのURLがwww.example.comで、ユーザー名とパスワードを入力してサインアップする必要がある場合は、ログインページhttp://www.example.com/loginにアクセスします。 .phpを今すぐ表示し、そのソースコードを表示して、次のようなフォームタグに含まれるアクションURLを検索します。

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

ここで、userinfo.phpを使用して「http://example.com/userinfo.php」となる絶対URLを作成し、単純なpythonスクリプトを実行します。

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

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

これがいつか誰かの助けになることを願っています。


これは、私が試したほとんどのWebサイトでは機能しません
Anurag Pandey 2016

私が見た20のヘルプ/ stackoverflowページのうち、これは私が必要とした1つのサイトで機能する唯一のソリューションでした。
ブイ2017

Web自動化の最良の選択はwebbotです。stackoverflow.com/a/51170181/6665568
Nateshbhat19年

すべての値は常にユーザー名とパスワードですか?これは私の選択したサイトでは機能していないようです。
ディランローガン

@DylanLogan常に、実際のWebページがサーバーに送信する内容を調べて、スクリプトをそれに適合させる必要があります。サーバーは、スクリプトとWebブラウザーを区別できないようにする必要があります。
Jeyekomon

28

通常、サイトにログインするにはCookieが必要です。つまり、cookielib、urllib、およびurllib2です。FacebookのWebゲームをプレイしていたときに書き戻したクラスは次のとおりです。

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

HTTPSまたはリダイレクトハンドラーは必ずしも必要ではありませんが、害はなく、オープナーの堅牢性が大幅に向上します。また、Cookieは必要ないかもしれませんが、投稿したフォームだけではわかりません。コメントアウトされた「Rememberme」入力から純粋にあなたがそうするかもしれないと私は思う。


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

詳細については、https//docs.python.org/2/library/urllib2.htmlをご覧ください。


リンクが機能していません:a2docs.python.orgURLに追加されました:docs.python.org/2/library/urllib2.html
Michael Kopp

18

Webページの自動化?間違いなく「ウェブボット」

webbot IDとクラス名が動的に変化し、seleniumやmechanizeよりも多くのメソッドと機能を備えたWebページでも機能します。

これがスニペットです:)

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

ドキュメントも非常に単純で使いやすいです:https//webbot.readthedocs.io


この例はうまく機能します。これはどこでも機能しautocomplete=offますか?
S Andrew

Win64ビットにはインストールされません。エラー:Could not find a version that satisfies the requirement webbot (from versions: 0.0.1.win-amd64)
Mostafa 2018

python3を使用してみてください
Natesh bhat 2018

webbotでiframeを処理する方法。
つまり

7

一般に、Webサイトはさまざまな方法で承認を確認できますが、ターゲットにしているWebサイトでは、かなり簡単に承認できるようです。

必要なのは、にあるPOSTauth/login(ラベルを忘れURLあなたがそこに見る様々なフィールドを持つフォームでエンコードされたブロブfor人間の訪問者のための彼らだ飾り、)。 handle=whatever&password-clear=pwdなど、ハンドル(別名電子メール)とパスワードの値を知っている限り、問題はありません。

おそらく、POSTはSet-Cookie、セッションを検証するヘッダーが付いた「ログインに成功しました」ページにリダイレクトします(必ず、そのCookieを保存して、セッションに沿ったさらなる対話で送り返してください!)。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.