【发布时间】:2012-04-23 13:07:48
【问题描述】:
我正在尝试使用 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 方法,当我们继续页面链接时,它使用 post。
如何获取特定页码的记录?
问候
【问题讨论】:
-
由于 ASP.NET 的 ViewState 验证,您可能无法 POST。这是所有表单值的荒谬哈希。
-
@jrummell - 那么可以做些什么来克服这个问题呢?
-
您将不得不根据您的 POST 变量(以及您未使用的页面上的变量)以某种方式重新创建 ViewState 哈希。我不知道你会怎么做。您可以访问 aspx 源吗?你能把它改成接受 GET 参数吗?
-
不,我无权访问 aspx 源,其完整的外部链接,但您确定是因为 ViewState 吗??
-
相当肯定,但我没有看到你得到的错误,所以我不能确定。
标签: php asp.net curl screen-scraping