5

Python で mechanize を使い始めたばかりですが、すでにいくつかの問題が発生しています。私は StackOverflow と Google を見回しましたが、ドキュメントは素晴らしく、簡単に機能させることができるはずだと人々が言っ​​ているのを見てきましたが、私はずっとそのドキュメントを探す方法を知らないと思います。見つけられるのは、私がやろうとしている特定のことを行う方法を実際には教えてくれないコード例です。誰かがそのようなドキュメントを教えてくれたら、喜んで自分で読んで問題を解決します。

実際の問題として、ユーザー名とパスワードの情報をフォームで送信して Web サイトにログインしようとしています。情報が正しい場合、通常はリダイレクトされますが、機械化では機能しません。

サブミットを呼び出した後にページの html コンテンツをすぐに印刷すると、認証が有効であることを示す変数がページに表示されるため、これは取得できない部分です。パスワードを間違ったものに変更すると、サイトを通常どおり閲覧している場合と同様に、html に「資格情報が無効です」というメッセージが表示されます。

これが私がやっている方法のコードサンプルです。例で見つけたものを適用しようとしているだけなので、完全に間違っている可能性があることに注意してください。

import mechanize
import cookielib

# Start Browser
br = mechanize.Browser()
cj = cookielib.LWPCookieJar()

br.set_cookiejar(cj)

br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)

br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

br.open('http://www.complexejuliequilles.com/')


for l in br.links(url_regex='secure'):
    br.follow_link(l)

br.select_form('form1')

br.form['fldUsername'] = 'myUsername'
br.form['fldPassword'] = 'myPassword'
br.submit()

この特定の例では、http://www.complexejulieequilles.comを開き、下部にある「管理」というテキストのあるリンクをたどり、フォームに資格情報を入力して送信します。通常、最初に表示したページにリダイレクトされますが、管理者のみが使用できるボタンがさらに表示されます。これらのリンクの 1 つをクリックして別のフォームに入力し、メール アドレスや名前などを持っているユーザーのリストを追加したいと考えています。

私が見逃している簡単なものはありますか?基本は理解できたと思いますが、リダイレクトの何が問題なのかを見つけるのに十分なほどライブラリを知りません。

4

1 に答える 1

8

http://wwwsearch.sourceforge.net/mechanize/documentation.html

「_http」を直接使用しないでください。名前の最初のアンダースコアは、開発者がそれをプライベートなものとして考えていたことを示しており、おそらくそれは必要ありません。

In [20]: mechanize.HTTPRefreshProcessor is mechanize._http.HTTPRefreshProcessor
Out[20]: True

URL を開く前に、実際には必要のないものをいくつか入れます。例: mechanize.Browser() は urllib ではなく、すでに Cookie を管理しています。robots.txt を避けるべきではありません。どのハンドラーがデフォルトであるかを前に確認することで、さらに「構成よりも規則」に従うことができます。

mechanize.Browser().handlers

そうでない場合は、おそらくそのリストにmechanize.HTTPRedirectHandlerがあります(私はそうです):

br.set_handle_redirect(mechanize.HTTPRedirectHandler)

for ループは奇妙です。ループ内でイテレータ (開いている URL 内のリンク) を変更しているようです (ブラウザが別の URL を開きます)。最初は、「安全な」URL が一致しているときに再帰的にクリックしたいと思っていました。エラーは、links() ジェネレーターの実装方法によって異なります (おそらく、固定の br.response() インスタンスに従います) が、一致する最初のリンクをたどりたいだけだと思います。

In [50]: br.follow_link(url_regex="secure") # No loops

どのようなリダイレクト/リフレッシュが必要かわかりません。JavaScript が wi​​ndow.location.href を変更しますか? その場合、JavaScript を自分で解析しない限り、mechanize はそれを行いません。

この方法で、最後に開いた URL に関する「生の」情報を取得できます。

last_response = br.response() # This is returned by br.open(...) too
http_header_dict = last_response.info().dict
html_string_list = last_response.readlines()
html_data = "".join(html_string_list)

JavaScript であっても、html_data.find()、正規表現、BeautifulSoup などを使用して、html_data 内に配置することでリダイレクト URL を取得できます。

PEP8 ノート: 孤立した "l" (下位の "L") を変数として使用しないでください。使用するフォントとコンテキストによっては、誤って "one" または "I" (上位の "i") に見える場合があります。代わりに「L」または他の名前を使用する必要があります。

于 2012-07-31T06:40:39.567 に答える