1

Pythonのリクエストモジュールを使用して、Webページのフォームに入力しています。フォームを POST リクエストとして送信していますが、これは正常に機能します。POST から期待どおりの応答が得られます。ただし、これは多段階のフォームです。最初の「送信」の後、サイトは同じページに別のフォームをロードします(AJAXを使用)。投稿応答には、この HTML ページがあります。では、この応答を使用して、新しいページのフォームに入力するにはどうすればよいでしょうか? Requests モジュールと Twill または Mechanize を何らかの方法で組み合わせることができますか?

POST のコードは次のとおりです。

import requests
from requests.auth import HTTPProxyAuth
import formfill
from twill import get_browser
from twill.commands import *
import mechanize
from mechanize import ParseResponse, urlopen, urljoin

http_proxy  = "some_Proxy"
https_proxy  = "some_Proxy"

proxyDict = { 
              "http"  : http_proxy, 
              "https" : https_proxy
            }

auth = HTTPProxyAuth("user","pass")
r = requests.post("site_url",data={'key':'value'},proxies=proxyDict,auth=auth)

上記の応答rには、そのフォームを送信した結果の新しい HTML ページが含まれています。この HTML ページには、記入しなければならないフォームもあります。これを何らかの方法で twill または mechanize に送信しr、Mechanize のフォーム入力 API を使用できますか? どんなアイデアも役に立ちます。

4

2 に答える 2

3

ここでの問題は、ページ上の JavaScript を実際に操作する必要があることです。requests、優れたライブラリである一方で、javascript の相互作用をサポートしていませんが、それは単なる http ライブラリです。

JavaScript が豊富な Web ページを意味のある方法で操作したい場合は、seleniumをお勧めします。Selenium は実際には、人間とまったく同じようにナビゲートできる完全な Web ブラウザーです。

主な問題は、速度が急激に低下することです。Web ページのレンダリングには、生の html リクエストよりもはるかに時間がかかります。それがあなたにとって本当の取引ブレーカーである場合は、2 つのオプションがあります。

  • ヘッドレス化: ここには多くのオプションがありますが、個人的にはcasperを好みます。ヘッドレスにすることでブラウジング時間が最大 3 倍速くなるはずですが、サイトはそれぞれ異なります。
  • http を介してすべてを行う方法を見つける: ほとんどの非ビジュアル サイト機能には、同等の http 機能があります。Google 開発者ツールのネットワーク タブを使用すると、実際に起動されているリクエストを掘り下げて、Python でそれらを複製できます。

あなたが言及したツールに関する限り、どちらmechanizeも役に立ちませんtwill。ここでの主な問題はCookie管理ではなくJavaScriptの相互作用であり、これらのフレームワークはどちらもJavaScriptの相互作用をサポートしていないため、同じ問題が発生します。

更新: 投稿の応答が実際に新しいページである場合、実際には AJAX をまったく操作していません。その場合で、実際に生の html がある場合は、フォームが送信する典型的な http 要求を単純に模倣する必要があります。最初のフォームで使用したのと同じアプローチが 2 番目のフォームでも機能します。HTML 応答から情報を取得するか、連続する要求を単純にハードコードすることができます。

于 2015-06-30T20:43:52.193 に答える
0

機械化を使用する:

#get the name of the form
for form in br.forms():
print "Form name:", form.name
print form
#select 1st form on the page - nr=1 for next etc etc
#OR just select the form with the name br.select_form(form.name)
br.select_form(nr=0) 
br.form['form#'] = 'Test Name'
#fill in the fields
r = br.submit() #can always pass in additional params
于 2015-06-30T20:37:21.067 に答える