これは私が何日も格闘してきた問題です。私は、このWeb サイトからのファイルのダウンロードを自動化しようとしています。うまくいけば、同様の構造を持つ他の Web サイトでも可能です。Web サイトが ASP であり、すべてのダウンロード リンクが次の形式の doPostBack 関数を呼び出すことを知っています。
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
selenium と phantomjs を介してリンクをクリックしようとしましたが、失敗しました。次に、関数呼び出しをエミュレートすることにしました。これには機械化を使用し、次のことを行いました。
def python_func(self,url,target,argument):
br = mechanize.Browser()
br.set_handle_robots(False)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US;
rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3. 0.1')]
br.open(url)
form_num = 0
while True:
try:
inner_browser.select_form(nr=form_num)
except FormNotFoundError:
return False
br.form.set_all_readonly(False)
inner_browser["__EVENTTARGET"] = targ
inner_browser["__EVENTARGUMENT"] = arg
response = inner_browser.submit()
残念ながら、フォームには送信コントロールがないようで、送信呼び出しから何も得られません。また、ASP doPostBack が持つ 4 つのフィールドを手動でエンコードすることにより、投稿要求をエミュレートしようとしました。これらは、eventtarget、eventargument、viewstate (デフォルト値あり)、および eventvalidaiton (デフォルト値あり) です。これもうまくいきません - ジニーメイのウェブサイトをもう一度手に入れてしまいます。
どうにかして doPostBack 関数を取得し、JavaScript インタープリターを使用して直接実行できると想定していますが、その方法がわかりません。これまでのところ、mechanize、selenium、phantomJS が機能していますが、コードを実行してファイルをダウンロードするためにそれらを活用できるかどうかはわかりません。