2011-02-08 12 views
2

私は機械化でログインが必要なページに接続しています。それは正面ページ上のいくつかのJavaScriptを使用して機械化をまっすぐに難しくしています。私はログインするためにどのようなフォームを提出しなければならないかを知っています。毎回同じようにjsによって常に生成されるものです。ページにないカスタムフォームを送信するだけで機械化するにはどうすればよいですか?基本的にthis perl problemと同等ですが、Pythonではpython mechanize - カスタムフォームを送信

答えて

5

(注:これは、最近再び上がってきた私は実際にそれが今で動作するようになった)

これは動作するようです:

br.open(URL) 
res = mechanize._form.ParseString(FORM_HTML, BASE_URL) 
br.form = res[1] 
#continue as if the form was on the page and selected with .select_form() 
br['username'] = 'foo' 
br['password'] = 'bar' 
br.submit() 

URLは、訪問したサイトの完全なURLです。 BASE_URLはURLが入っているディレクトリです。FORM_HTML二つの形式を返しますmechanize._form.ParseString何らかの理由により、form要素を持っている任意のHTML、例えば:

<form method='post' action='/login.aspx'> 
    <input type='text' name='username'> 
    <input type='text' name='password'> 
    <input type='hidden' name='important_js_thing' value='processed_with_python TM'> 
</form> 

です。最初は、入力なしでベースURLへのGET要求です。 2番目は、適切に解析された形式FORM_HTMLです。

+1

私はできればあなたに+100を与えるだろう。これはどうやって分かりましたか? Web上の他の誰もこれを思いついた人はいません。多くの人がこの解決策なしであきらめてしまいました。 –

+0

@mh ..:ハハ、それを聞いてうれしい!私は束を機械化して使用したので、私はちょうどソースコードを掘り下げて、たくさんのものを試して、やっとそれを動作させたと思います... – Claudiu

0

ページを解析して、必要な要素を抽出し、ページを改訂して機械化に戻します。

私が取り組んだプロジェクトでは、シミュレートされたブラウザを使用しなければならず、Mechanizeがフォーム処理に非常に貧弱であることがわかりました。 Javascriptのブロックから解釈されない要素をヤンクして死ぬだろう。私は、それがフォームパーサーに到達する前に死ぬ原因となるすべてのビットを取り除くためにBeautifulSoupを使用した回避策を書く必要がありました。

あなたはその問題に遭遇するかもしれないし、そうでないかもしれないが、心に留めておくべきことだ。私は最終的にMechanizeアプローチを放棄して終了し、Seleniumと一緒に行きました。フォームハンドラははるかに優れており、JSを処理することができます。それは問題を抱えています(ブラウザには複雑さが加わります)が、作業がはるかに簡単です。

関連する問題