2

HTML をスクレイピングしようとしています (作成者の許可を得て)。ここで提案されている PHP ライブラリを使用していましたが、次のようなリンクに遭遇するまではうまく機能していました。

<a href="javascript:__doPostBack('dgItem$_ctl2$_ctl0','')">

私が信じているのは、asp.netのことです。クリックしても、URL は変更されず、新しいコンテンツがページに読み込まれるだけで、これもスクレイピングしたいと思います。

どうすればこれを回避できますか?

クリックをシミュレートする必要があると思いますが、生の HTML を処理するときはそれができません。ある種のブラウザ/JS インタープリターが必要ですよね?

このタスクに適したライブラリはありますか? 私はPHPに限定されていませんが、それが好ましいです。

4

2 に答える 2

7

__doPostBack()確かにASP.NETのものです。関数の機能は次のとおりです。

var theForm = document.forms['FORMNAME'];
if (!theForm) {
    theForm = document.FORMNAME;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}

基本的に、2 つの非表示フィールド (__EVENTTARGETおよび__EVENTARGUMENT) の値をそれぞれのパラメーターの値に設定します。次に、フォームを送信します。

必要に応じて、引き続き PHP HTML パーサーを使用して作業を行うこともできますが、これらの__doPostBack()リンクのいずれかに遭遇した場合は、手動で POST 要求を作成する必要があります。大まかに言うと、次のようになります。

  1. 現在のフォーム値を取得します。おそらく、各input要素などをループして、値を配列に追加する必要があります。ページにテキスト ボックス、チェックボックスなどがない場合は、.NET がデフォルトで埋め込む非表示フィールド ( 、 など) のみを残す必要があり__VIEWSTATEます__EVENTVALIDATION
  2. に渡された値を解析し、doPostBack()および の既存の値を上書きし__EVENTTARGETます__EVENTARGUMENT
  3. POST リクエストを作成します。あなたが見ているライブラリがこの方法を提供するもの (もしあれば) はわかりませんが、PHP からこれを行う一般的な方法は、cURL 拡張機能を使用することです。例については、http://davidwalsh.name/execute-http-post-php-curlを参照してください。
  4. HTML の結果を取得し、通常どおりライブラリで解析します。

あるいは、同じページに対してほぼ同じリクエストを常に行っている場合は、フォームの解析のいくつかのステップをスキップして、POST リクエストの作成に直接ジャンプすることもできます。

それはそれほど楽しいことではありませんが、この場合はうまくいくでしょう。JSが関係するより複雑なケースに対処する必要がある場合、またはこれを別の方法で処理したい場合は、基本的にブラウザを駆動してこれらを処理するライブラリがあります(前述のとおり)。最初に思いつくのは次の2つです。

他にもオプションはありますが、既存の PHP スクリプトにすばやく簡単に統合できるものは知りません。

于 2012-06-26T23:52:50.163 に答える
1

Selenium Firefox WebドライバーでPythonを使用することになりました。本物のブラウザを使っているので、FFでできることはすべてできます。

于 2012-11-05T08:04:11.423 に答える