1

現在、pycurl を理解しようとしています。Web サイトにログインしようとしています。サイトにログインすると、メイン ページにリダイレクトされます。ただし、このスクリプトを試すと、ログイン ページに返されます。私は何を間違っているのでしょうか?

import pycurl
import urllib
import StringIO

pf = {'username' : 'user', 'password' : 'pass' }
fields = urllib.urlencode(pf)
pageContents = StringIO.StringIO()

p = pycurl.Curl()
p.setopt(pycurl.FOLLOWLOCATION, 1)
p.setopt(pycurl.COOKIEFILE, './cookie_test.txt')
p.setopt(pycurl.COOKIEJAR, './cookie_test.txt')
p.setopt(pycurl.POST, 1)
p.setopt(pycurl.POSTFIELDS, fields)
p.setopt(pycurl.WRITEFUNCTION, pageContents.write)
p.setopt(pycurl.URL, 'http://localhost')
p.perform()

pageContents.seek(0)
print pageContents.readlines()

編集:ピーターが指摘したように、URLはログインURLを指す必要がありますが、これを機能させようとしているサイトは、これがどのURLになるかを表示できません。フォームのアクションは、ホームページ ( /index.html ) を指すだけです。

4

2 に答える 2

3

この問題のトラブルシューティングを行う際には、FireBugやLiveHTTPHeadersなどのブラウザープラグインを入手することをお勧めします(Firefoxプラグインをお勧めしますが、他のブラウザーにも同様のプラグインがあります)。次に、サイトへのリクエストを実行して、ターゲットサーバーに渡されているアクション(URL)、メソッド、およびフォームのパラメーターを確認できます。これは、問題の核心を解明するのに役立つ可能性があります。

それでも問題が解決しない場合は、機械化に別のツールを使用することを検討してください。ClientFormBeautifulSoupを使用して同様の操作を実行しました。pycURLドキュメントと上記のコードで読んだ内容に基づくと、ClientFormの方が使用に適したツールである可能性があります。ClientFormは、HTMLページを解析し、その上にあるフォーム(ログインフォームを含む)を見つけて、フォームに入力した回答に基づいて適切なリクエストを作成します。ClientFormをpycURLで使用することもできますが、少なくともClientFormは、POSTする適切なアクションを提供し、適切なパラメーターをすべて作成します。

ただし、ログインフォームの必要な部分を処理するJavaScriptがある場合、ClientFormでさえそこでは役に立たないことに注意してください。ログインを効果的に自動化するには、JavaScriptを解釈するものが必要になります。その場合、私はSeleniumRCを使用してブラウザーを制御しました(そしてブラウザーにJavaScriptを処理させました)。

于 2010-06-17T14:19:32.000 に答える
2

ゴールデン ルールの 1 つは、pycurl の例を解決しようとするときにデバッグを有効にする必要があることです。

注: p.perform()の後にp.close( )を使用することを忘れないでください


def test(debug_type, debug_msg):
    if len(debug_msg) < 300:
        print "debug(%d): %s" % (debug_type, debug_msg.strip())

p.setopt(pycurl.VERBOSE, True)
p.setopt(pycurl.DEBUGFUNCTION, test)

デバッグが有効になっているため、コードがどのように動作しているかを確認できます

import pycurl
import urllib
import StringIO

def test(debug_type, debug_msg):
    if len(debug_msg) < 300:
        print "debug(%d): %s" % (debug_type, debug_msg.strip())    

pf = {'username' : 'user', 'password' : 'pass' }
fields = urllib.urlencode(pf)
pageContents = StringIO.StringIO()

p = pycurl.Curl()
p.setopt(pycurl.FOLLOWLOCATION, 1)
p.setopt(pycurl.COOKIEFILE, './cookie_test.txt')
p.setopt(pycurl.COOKIEJAR, './cookie_test.txt')
p.setopt(pycurl.POST, 1)
p.setopt(pycurl.POSTFIELDS, fields)
p.setopt(pycurl.WRITEFUNCTION, pageContents.write)
p.setopt(pycurl.VERBOSE, True)
p.setopt(pycurl.DEBUGFUNCTION, test)
p.setopt(pycurl.URL, 'http://localhost')
p.perform()

p.close() # This is mandatory.

pageContents.seek(0)
print pageContents.readlines()
于 2013-10-31T05:48:30.200 に答える