16

アドレス、電子メールなどを含むユーザーのリストを含むWebページをスクラップしたい.Webページにはページネーション付きのユーザーのリストが含まれている.つまり、ページ2のリンクをクリックするとページに10人のユーザーが含まれている.AJAXを介して2番目のページからユーザーリストをロードし、リストを更新する.すべてのページネーション リンクに対してオン。

私はasp.netについて何も知らず、aspがページネーションとAJAXを管理する方法を知らないので、ウェブサイトは拡張子.aspxのasp ieページで開発されています

私は単純なhtml dom http://sourceforge.net/projects/simplehtmldom/を使用してスクラップを含んでいます

ユーザー<=10 がいるページの場合、ユーザーがページネーションリンクをクリックしたときと同じようにAJAXリクエストをシミュレートする必要はありません

しかし、他のページからデータを取得するためのページネーションを持つページについては、ポストAJAXリクエストをシミュレートしています

require 'simple_html_dom.php';

$html = file_get_html('www.example.com/user_list.aspx');

$viewstate = $html->find("#__VIEWSTATE");
$viewstate = $viewstate[0]->attr['value'];

$eventvalidation        = $html->find("#__EVENTVALIDATION");
$eventvalidation        = $eventvalidation[0]->attr['value'];
$number_of_pageinations = 3;

$pageNumberCodes = array(
    'ctl00$cphMainContent$rdpMembers$ctl01$ctl01',
    'ctl00$cphMainContent$rdpMembers$ctl01$ctl02',
    'ctl00$cphMainContent$rdpMembers$ctl01$ctl03'
); // this code is added for each page in POST  as  __EVENTTARGET 

for ($i = 0; $i < $number_of_pageinations; $i++) {
    $options = array(
        CURLOPT_RETURNTRANSFER => true, // return web page
        CURLOPT_HEADER => false, // don't return headers
        CURLOPT_ENCODING => "", // handle all encodings
        CURLOPT_USERAGENT => "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7'", // who am i
        CURLOPT_AUTOREFERER => true, // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
        CURLOPT_TIMEOUT => 1120, // timeout on response
        CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
        CURLOPT_POST => true,
        CURLOPT_VERBOSE => true,
        CURLOPT_POSTFIELDS => urlencode('ctl00%24scriptManager=ctl00%24cphMainContent%24ctl00%24cphMainContent%24rdpMembersPanel%7C' . $pageNumberCodes[0] . '&__EVENTTARGET=' . $pageNumberCodes[0] . '&__EVENTARGUMENT=' . '&__VIEWSTATE=' . $viewstate . '&__EVENTVALIDATION=' . $eventvalidation . "&google=" . '&ctl00%24cphMainContent%24txtZip=' . '&ctl00%24cphMainContent%24cboRadius=Exact' . '&ctl00%24cphMainContent%24txtMemberName=' . '&ctl00%24cphMainContent%24txtCity=Honolulu' . '&ctl00%24cphMainContent%24cboState=HI' . '&ctl00%24cphMainContent%24txtAddress=' . '&ctl00_cphMainContent_rdpMembers_ClientState=' . '&ctl00%24cphMainContent%24ddList=-Select%20field%20to%20sort-' . '&ctl00_cphMainContent_ddList_ClientState=' . '&ctl00_cphMainContent_rdlMembers_ClientState=' . '&ctl00_cphMainContent_ddList_ClientState=' . '&ctl00_cphMainContent_rdlMembers_ClientState=' . '&ctl00_cphMainContent_rdpMembers1_ClientState=' . '&__ASYNCPOST=true' . 'RadAJAXControlID=ctl00_cphMainContent_RadAjaxManager1')
    );
    $ch      = curl_init($url);
    curl_setopt_array($ch, $options);
    $return = curl_exec($ch);
    curl_close($ch);
    echo $return;

    $newHtml = str_get_html($return);

    $viewstate = $newHtml->find("#__VIEWSTATE");
    $viewstate = $viewstate[0]->attr['value'];

    $eventvalidation = $newHtml->find("#__EVENTVALIDATION");
    $eventvalidation = $eventvalidation[0]->attr['value'];
}

これはさまざまなページからのデータをエコーする必要がありますが、常に最初のページのデータを出力します。だれかがどこで私が着用しているのか、何が欠けているのかを指摘できますか?aspがページネーションとAJAXリクエストをどのように管理しているか__EVENTARGUMENT__VIEWSTATEそして__EVENTVALIDATION

4

4 に答える 4

28

一般に、ASP.NET Web サイトを偽装して、実際にボタンを押したと思わせる (より一般的には、ポストバックを実行した) ようにするには、次の手順を実行する必要があります。

  1. ページ上のすべての INPUT および SELECT 要素の値を取得します。すべてのシナリオで必要になるわけではありませんが、少なくとも名前が「__」で始まるすべての非表示フィールド (__VIEWSTATE など) の値を常に取得する必要があります。それらに何が書かれているかを実際に知る必要はありません-それらの値を変更せずにサーバーに送り返す必要があるだけです。

  2. サーバーへの POST 要求を作成します。AJAX リクエストを避けて、従来の POST を使用する必要があります。一部のブラウザー プラグイン (Firefox または Chrome) を使用すると、XMLHttpRequest を無効にして、Fiddler などのツールで非 AJAX 要求をインターセプトできる場合があります。

  3. #1 からすべての値をその投稿リクエストに追加します。上書きする必要がある値は、__EVENTTARGET と __EVENTARGUMENT の 2 つだけです。模倣しようとするリンクまたはボタンに のonclickようなハンドラがある場合を除いて、これらは空のままにします<a href="javascript:__doPostBack('ctl00$login','')">。そうである場合は、このリンクから値を解析します。最初の値はイベント ターゲット (通常はページ上の要素の ID と一致します)、2 番目はイベント引数です。

  4. リクエストを正しく実行すると、HTML ページが返されるはずです。部分的な応答を受け取った場合は、非同期の結果を要求する HTTP ヘッダーを渡していないかどうかを確認してください。

于 2013-02-19T17:44:17.897 に答える
3

私の最善のアドバイスは、iMacroshttps://addons.mozilla.org/en-US/firefox/addon/imacros-for-firefox/を使用することです

iMacros:

  1. ページのダウンロードの流れを記録します。http://wiki.imacros.net/First_Steps
  2. Webページをローカルディレクトリに保存します。http://wiki.imacros.net/SAVEAS
  3. PHPスクリプトを使用して、電子メール、アドレスなどをスクラップします。

ajax(.aspx、.jsp、.php)のいずれであっても。

于 2013-02-21T18:33:22.893 に答える
2

Ruby に分岐して、Selenium を使用する健全な方法であるCapybaraを試すことをお勧めします。ページにアクセスしてから、実際の DOM を調べることができます。すべてをクリックしたり、イベントを待ったりすることができます。実際のブラウザを使用します。

visit "http://www.google.com" 
page.find("button[name=btnK]")
于 2013-02-25T00:59:12.953 に答える
0

私はあなたのものをベースとしていくつかのテストコードを動作させました.私が見つけた唯一の問題はこの行でした.

CURLOPT_POSTFIELDS => urlencode('ctl00%24scriptManager=ctl00%24cphMainContent%24ctl00%24cphMainContent%24rdpMembersPanel%7C' . $pageNumberCodes[0] . '&__EVENTTARGET=' . $pageNumberCodes[0] . '&__EVENTARGUMENT=' . '&__VIEWSTATE=' . $viewstate . '&__EVENTVALIDATION=' . $eventvalidation . "&google=" . '&ctl00%24cphMainContent%24txtZip=' . '&ctl00%24cphMainContent%24cboRadius=Exact' . '&ctl00%24cphMainContent%24txtMemberName=' . '&ctl00%24cphMainContent%24txtCity=Honolulu' . '&ctl00%24cphMainContent%24cboState=HI' . '&ctl00%24cphMainContent%24txtAddress=' . '&ctl00_cphMainContent_rdpMembers_ClientState=' . '&ctl00%24cphMainContent%24ddList=-Select%20field%20to%20sort-' . '&ctl00_cphMainContent_ddList_ClientState=' . '&ctl00_cphMainContent_rdlMembers_ClientState=' . '&ctl00_cphMainContent_ddList_ClientState=' . '&ctl00_cphMainContent_rdlMembers_ClientState=' . '&ctl00_cphMainContent_rdpMembers1_ClientState=' . '&__ASYNCPOST=true' . 'RadAJAXControlID=ctl00_cphMainContent_RadAjaxManager1')

urlencode を次のように移動する必要があります。

CURLOPT_POSTFIELDS => 'ctl00%24scriptManager=ctl00%24cphMainContent%24ctl00%24cphMainContent%24rdpMembersPanel%7C' . $pageNumberCodes[0] . '&__EVENTTARGET=' . $pageNumberCodes[0] . '&__EVENTARGUMENT=' . '&__VIEWSTATE=' . rawurlencode($viewstate) . '&__EVENTVALIDATION=' . rawurlencode($eventvalidation) . "&google=" . '&ctl00%24cphMainContent%24txtZip=' . '&ctl00%24cphMainContent%24cboRadius=Exact' . '&ctl00%24cphMainContent%24txtMemberName=' . '&ctl00%24cphMainContent%24txtCity=Honolulu' . '&ctl00%24cphMainContent%24cboState=HI' . '&ctl00%24cphMainContent%24txtAddress=' . '&ctl00_cphMainContent_rdpMembers_ClientState=' . '&ctl00%24cphMainContent%24ddList=-Select%20field%20to%20sort-' . '&ctl00_cphMainContent_ddList_ClientState=' . '&ctl00_cphMainContent_rdlMembers_ClientState=' . '&ctl00_cphMainContent_ddList_ClientState=' . '&ctl00_cphMainContent_rdlMembers_ClientState=' . '&ctl00_cphMainContent_rdpMembers1_ClientState=' . '&__ASYNCPOST=true' . 'RadAJAXControlID=ctl00_cphMainContent_RadAjaxManager1'
于 2013-12-01T23:57:14.737 に答える