Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用php curl抓取aspx页面_Php_Asp.net_Curl_Screen Scraping - Fatal编程技术网

使用php curl抓取aspx页面

使用php curl抓取aspx页面,php,asp.net,curl,screen-scraping,Php,Asp.net,Curl,Screen Scraping,我正在尝试使用php curl代码刮取一个aspx页面,其中包含数据页面。最初,页面使用get方法加载,但当我们从下拉列表中选择页码时,它使用post方法提交页面 我想通过将postfields传递给curl来查找特定page no的数据,但无法做到这一点 我创建了一个伪代码来获取第5页的记录,但它总是返回第一页的结果 示例代码 $url = 'http://www.ticketalternative.com/SitePages/Search.aspx?catid=All&pattern

我正在尝试使用php curl代码刮取一个aspx页面,其中包含数据页面。最初,页面使用get方法加载,但当我们从下拉列表中选择页码时,它使用post方法提交页面

我想通过将postfields传递给curl来查找特定page no的数据,但无法做到这一点

我创建了一个伪代码来获取第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

如何获取特定页码的记录


关于

当客户端需要时,我有时会用php编写scraper,但我绝不会尝试用php来刮取ASP.NET站点。为此,您需要perl-python或ruby。所有3个都有一个mechanize库,这通常使发布变得简单。

由于ASP.NET的ViewState验证,您可能无法发布。所有表单值的散列都是荒谬的。@jrummell-那么如何克服这个问题呢?您必须根据POST变量和页面上未使用的变量以某种方式重新创建ViewState散列。我不知道你会怎么做。您有权访问aspx源吗?你能把它改成接受GET参数吗?不,我没有访问aspx源的权限,它的完整外部链接,但是你确定它是因为ViewState吗?相当确定,但是我没有看到你得到的错误,所以我不能确定。