13

私は以下のウェブサイトをこすり取ろうとしています:

http://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=0&type=8&season=2011&month=0&season1=2011&ind=0&team=0&rost=0&players=0

「データのエクスポート」というタイトルの表の右上にある小さなボタンをクリックすると、javascriptスクリプトが実行され、ブラウザがファイルを.csv形式でダウンロードします。これを自動的に実行できるPhantomJSスクリプトを記述できるようにしたいと思います。何か案は?

上記のボタンは、次のようにHTMLにコード化されています。

<a id="LB_cmdCSV" href="javascript:__doPostBack('LB$cmdCSV','')">Export Data</a></div>

この関数は、HTMLソースコードにもあります。

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>

私はPhantomJS/Javascriptに非常に慣れていないので、ここでいくつかのポインターを使用できます。これを自動的に行うために必要なすべての情報を見つけたと思いますが(間違っている場合は修正してください)、コーディングをどこから始めればよいかわかりません。助けてくれてありがとう。

編集-これは私のスクリプトが今どのように見えるかです:

var page = new WebPage();
url = 'http://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=0&type=8&season=2011&month=0&season1=2011&ind=0&team=0&rost=0& players=0';

page.open(encodeURI(url), function (status){
  if (status !== "success") {
    console.log("Unable to access website");
  } else {
      page.evaluate(function() {
        __doPostBack('LB$cmdCSV', '');
      });
    }
  phantom.exit(0);
});
4

4 に答える 4

1

私にとって非常にうまく機能したのは、目的の要素でのマウスクリックをシミュレートすることです。

page.evaluate(function () {
  var btn = document.getElementById('LB_cmdCSV')
  var ev = document.createEvent('MouseEvent')
  ev.initEvent('click', true, true)
  btn.dispatchEvent(ev)
})
于 2015-06-18T10:52:35.800 に答える
0

__doPostBack('LeaderBoard1$cmdCSV','');Web ページのコンテキスト内でコード を実行できませんでしたか?

このようなもの:

page.evaluate(function() {
  __doPostBack('LeaderBoard1$cmdCSV','');
});

PhantomJS 内でこのコードをテストしていませんが、Google Chrome の開発者コンソールから __doPostBack メソッドを実行すると機能するため、理論的には機能するはずです。PhantomJS で JavaScript コードを実行することに疑問がある場合、Google Chrome の開発者コンソールは、PhantomJS のような WebKit で実行されるコードをテストする優れた方法です。これが役立つことを願っています。

于 2012-01-27T17:29:53.900 に答える
-1

Ruby on Rails と Watir Webdriver ( https://github.com/watir/watir-webdriver ) を使用しています。

顧客によって定義されたユーザー エージェントが使用する「doPostBack」と同一のブラウザーを使用する場合、ツールが ASP.NET を使用することを確認しました。PhantomJS を使用する場合、ユーザー エージェントは "Mozilla/5.0 (Unknown; Linux i686) AppleWebKit/534.34 (Gecko のような KHTML) Safari/534.34 PhantomJS/1.9.1" として識別されます。

そのため、ページにアクセスする前にユーザー エージェント クライアントを変更する必要があります。Railsで次のようなことをしました:

HTTP_USER_AGENT    = "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:22.0) Gecko/20100101 Firefox/22.0"
HTTP_DRIVER        = Selenium::WebDriver.for :phantomjs, :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.phantomjs(
  "phantomjs.page.settings.userAgent" => HTTP_USER_AGENT
)
...
browser = Watir::Browser.new HTTP_DRIVER, :http_client => client
于 2013-07-03T15:25:57.143 に答える
-1

これは ASP を利用した Web サイトであるため、ほとんどの Web サイトよりも少しトリッキーになります。cURL コマンドを使用して、フォーム全体のビューステートとイベント検証文字列をサーバーに戻す POST を模倣する必要があります。おそらく、あなたが持っているページからデータを直接持ち上げるだけで簡単になります。

于 2012-02-06T03:03:21.883 に答える