2014-01-15 61 views
0

我想从页面中提取数据,使用DOMCrawler Symfony 2。这是我想从中获取数据的页面:http://kovv.mavari.be/kalender.aspx如何从站点获取__EVENTVALIDATION和__VIEWSTATE

但是我希望它发布后,当你点击'zoek'(下拉框中没有参数)。这是我想要的页面!起初我有:$html = file_get_contents("http://kovv.mavari.be/kalender.aspx");。但显然这只会加载没有帖子的第一页。

这是我现在有:

$post = http_build_query(array(
      'ctl00_ContentPlaceHolder1_ddlGeslacht' => 'Heren', 
      'ctl00$ContentPlaceHolder1$ddlReeks' => '', 
      'ctl00_ContentPlaceHolder1_ddlDatum' => '', 
      'ctl00$ContentPlaceHolder1$btnZoek:zoek' 
)); 

$options= array('http' => array(
    'method' => 'POST', 
    'header' => 'Content-type: application/x-www-form-urlencoded', 
    'content' => $post 
)); 

$context = stream_context_create($options); 

$html = file_get_contents('http://kovv.mavari.be/kalender.aspx', false, $context); 

但从my other Stack Overflow topic,我才知道,我也有送__EVENTVALIDATION和__VIEWSTATE为好。但我不知道得到它们。我该如何解决这个问题? (对于在谷歌搜索或使一些关键的话也将是巨大的!)

这是我现在有:

$url = "http://kovv.mavari.be/kalender.aspx"; 
$regs = array(); 

$cookies = '../src/VolleyScout/VolleyScoutBundle/Resources/doc/cookie.txt'; 

// Regular expressions to parse out the special ASP.NET 
// values for __VIEWSTATE and __EVENTVALIDATION 
$regexViewstate = '/__VIEWSTATE\" value=\"(.*)\"/i'; 
$regexEventVal = '/__EVENTVALIDATION\" value=\"(.*)\"/i'; 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
$data=curl_exec($ch); 

$viewstate = $this->regexExtract($data,$regexViewstate,$regs,1); 
$eventval = $this->regexExtract($data, $regexEventVal,$regs,1); 

$postData = '__VIEWSTATE=' 
      . rawurlencode($viewstate) 
      . '&__EVENTVALIDATION='.rawurlencode($eventval) 
      . '&ctl00_ContentPlaceHolder1_ddlGeslacht=Heren' 
      . '&ctl00$ContentPlaceHolder1$ddlReeks' 
      . '&ctl00_ContentPlaceHolder1_ddlDatum' 
      . '&ctl00$ContentPlaceHolder1$btnZoek:zoek' 
; 

curl_setOpt($ch, CURLOPT_POST, TRUE); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies); 

curl_setOpt($ch, CURLOPT_POST, FALSE); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies); 

$data = curl_exec($ch); 

echo $data; 

curl_close($ch); 

但我仍然得到页无后,我失去了什么?

回答

1

HTTP是一种无状态协议,这意味着客户端和服务器没有内置的方式来跟踪从一个请求到下一个请求的应用程序状态。已经发明了各种技术来规避这种如cookie。 ViewState和事件验证是ASP.NET使用的两种技术,为网页提供了一种全面的感觉。

欲了解更多信息,请参阅link

+0

有没有办法得到这个?因为我需要一篇文章后的数据。 – nielsv

+0

请参阅http://stackoverflow.com/questions/12786199/access-viewstate-eventvalidation-in-c-sharp – Pawan

+0

有没有办法做到在PHP? – nielsv

相关问题