6

これは私が何日も格闘してきた問題です。私は、この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 が機能していますが、コードを実行してファイルをダウンロードするためにそれらを活用できるかどうかはわかりません。

4

0 に答える 0