ASP.NETページのデータスクレイピング:__doPostBackを利用したページネーション対応

最近、HTTPリクエストを模倣してデータをスクレイピングする必要がありましたが、対象サーバーはASP.NETで開発されていました。

ページネーションコントロールのコードは以下の通りです。

    <tr>
        <td align="left">合計&nbsp210&nbsp件のレコード&nbsp--&nbsp第&nbsp2&nbspページ&nbsp--&nbsp全&nbsp3&nbspページ</td><td align="right"><a id="MyPager1_First" href="javascript:__doPostBack(&#39;MyPager1$First&#39;,&#39;&#39;)"> 最初へ </a>&nbsp;<a id="MyPager1_Prev" href="javascript:__doPostBack(&#39;MyPager1$Prev&#39;,&#39;&#39;)"> 前へ <br></br></a>&nbsp;<a id="MyPager1_Next" href="javascript:__doPostBack(&#39;MyPager1$Next&#39;,&#39;&#39;)"> 次へ </a>&nbsp;<a id="MyPager1_Last" href="javascript:__doPostBack(&#39;MyPager1$Last&#39;,&#39;&#39;)"> 最後へ </a><select name="MyPager1$PageList" onchange="javascript:setTimeout(&#39;__doPostBack(\&#39;MyPager1$PageList\&#39;,\&#39;\&#39;)&#39;, 0)" id="MyPager1_PageList">
            <option value="0">1</option>
            <option selected="selected" value="1">2</option>
            <option value="2">3</option>

        </select></td>
    </tr>

「次へ」ボタンをクリックすると、実際にはJavaScriptメソッドが呼び出されます。

javascript:__doPostBack(&#39;MyPager1$Next&#39;,&#39;&#39;)

キャプチャしたリクエスト情報を元に、POSTデータを構築しました。

                post_data = "__EVENTTARGET=MyPager1%24Next&__EVENTARGUMENT=" + getInputValueById(page_html, "__EVENTARGUMENT") + "&__LASTFOCUS=&__VIEWSTATE=" + getInputValueById(page_html, "__VIEWSTATE") + "&__VIEWSTATEGENERATOR=" + getInputValueById(page_html, "__VIEWSTATEGENERATOR") + "&__VIEWSTATEENCRYPTED=&" + getInputValueById(page_html, "__VIEWSTATEENCRYPTED") + "&searchKeyword=テスト&startDate=2023-01-01&endDate=2023-12-31&MyPager1%24PageList=" + current_page;
                page_html = scraper.post(main_url + "Data/List.aspx?Section=reports", post_data, main_url + "Data/List.aspx?Section=reports", "UTF-8");

しかし、サーバーからは以下のエラーが返されました。

無効なポストバックまたはコールバック引数です。イベント検証が有効になっています。<pages enableEventValidation="true"/>の構成、またはページ内の<%@ Page EnableEventValidation="true" %>で有効になっています。<br></br>セキュリティ上の理由から、この機能はポストバックまたはコールバックイベントの引数が、それを元々レンダリングしたサーバーコントロールからのものであることを検証します。データが有効で予期される場合は、<br></br>ClientScriptManager.RegisterForEventValidationメソッドを使用して、ポストバックまたはコールバックデータを検証のために登録してください。

このエラーにより、目的の第2ページデータを取得できませんでした。

タグ: ASP.NET Webスクレイピング ページネーション __doPostBack イベント検証

5月20日 12:59 投稿