1

ページごとのデータを含むphp curlコードを使用してaspxページをスクレイピングしようとしています。最初にページは get メソッドでロードされますが、ページ番号を選択すると. ドロップダウンから、post メソッドを使用してページを送信します。

postfields を curl に渡して特定のページ番号のデータを検索したいのですが、それができませんでした。

5 ページ目のレコードを取得するダミー コードを作成しましたが、常に最初のページの結果が返されます。

サンプルコード

$url = 'http://www.ticketalternative.com/SitePages/Search.aspx?catid=All&pattern=Enter%20Artist%2c%20Team%2c%20or%20Venue';
$file=file_get_contents($url);
//<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=
preg_match_all("#<input.*?name=\"__VIEWSTATE\".*?value=\"(.*?)\".*?>.*?<input.*?name=\"__EVENTVALIDATION\".*?value=\"(.*?)\".*?>#mis", $file, $arr_viewstate); 
$viewstate = urlencode($arr_viewstate[1][0]);
$eventvalidation = urlencode($arr_viewstate[2][0]); 
$options = array( 
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => true, // don't return headers 
CURLOPT_FOLLOWLOCATION => true, // follow redirects 
CURLOPT_ENCODING => "", // handle all encodings 
CURLOPT_USERAGENT => "spider", // 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 => '__EVENTTARGET='.urlencode('ctl00$ContentPlaceHolder1$SearchResults1$SearchResultsGrid$ctl13$ctl05').'&__EVENTARGUMENT='.urlencode('').'&__VIEWSTATE='.$viewstate.'&__EVENTVALIDATION='.$eventvalidation.'&__LASTFOCUS='.urlencode('').'&ctl00$ContentPlaceHolder1$SearchResults1$SearchResultsGrid$ctl13$ctl05=4');
$ch = curl_init($url); 
curl_setopt_array($ch,$options);
$result = curl_exec($ch);
curl_close($ch);

preg_match_all('/<a id=\".*?LinkToVenue\" href=\"(.*?)\">(.*?)<\/a>/ms',$result,$matches);
print_r($matches);

最初にページがGETメソッドで読み込まれ、ページリンクに移動すると投稿が使用されるため、機能していないと思います。

特定のページ番号のレコードを取得するにはどうすればよいですか?

よろしく

4

1 に答える 1

-3

私は、クライアントが必要とするときに PHP でスクレイパーを作成することがありますが、PHP で ASP.NET サイトをスクレイピングしようとはしません。そのためには、perl python または ruby​​ が必要です。3つすべてに、通常は簡単にする機械化ライブラリがあります。

于 2012-04-24T07:48:09.733 に答える