最近、HTTPリクエストを模倣してデータをスクレイピングする必要がありましたが、対象サーバーはASP.NETで開発されていました。
ページネーションコントロールのコードは以下の通りです。
<tr>
<td align="left">合計 210 件のレコード -- 第 2 ページ -- 全 3 ページ</td><td align="right"><a id="MyPager1_First" href="javascript:__doPostBack('MyPager1$First','')"> 最初へ </a> <a id="MyPager1_Prev" href="javascript:__doPostBack('MyPager1$Prev','')"> 前へ <br></br></a> <a id="MyPager1_Next" href="javascript:__doPostBack('MyPager1$Next','')"> 次へ </a> <a id="MyPager1_Last" href="javascript:__doPostBack('MyPager1$Last','')"> 最後へ </a><select name="MyPager1$PageList" onchange="javascript:setTimeout('__doPostBack(\'MyPager1$PageList\',\'\')', 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('MyPager1$Next','')
キャプチャしたリクエスト情報を元に、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ページデータを取得できませんでした。