首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从站点获取__EVENTVALIDATION和__VIEWSTATE

如何从站点获取__EVENTVALIDATION和__VIEWSTATE
EN

Stack Overflow用户
提问于 2014-01-15 11:57:42
回答 1查看 2K关注 0票数 0

我想使用DOMCrawler of 塞弗尼2从页面中提取数据。这是我想从以下页面获取数据的页面:http://kovv.mavari.be/kalender.aspx

但是当你点击'zoek‘(在下拉列表中没有参数)时,我想要它在帖子之后。这就是我想要的那一页!一开始我有:$html = file_get_contents("http://kovv.mavari.be/kalender.aspx");。但是很明显,这只会在没有帖子的情况下加载第一页。

这就是我现在拥有的:

代码语言:javascript
复制
$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);

但是从我的另一个堆栈溢出主题,我了解到我也必须发送__EVENTVALIDATION和__VIEWSTATE。但我不知道怎么弄到它们。我怎样才能解决这个问题?(在Google上搜索的一些关键词也很棒!)

这就是我现在拥有的:

代码语言:javascript
复制
$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);

但我还是没有发帖子,是不是漏掉了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-15 12:07:10

HTTP是一种无状态协议,这意味着客户端和服务器没有构建用于跟踪从一个请求到下一个请求的应用程序状态的方法。人们发明了各种各样的技术来规避这种情况,比如cookie。ViewState和事件验证是ASP.NET用来给网页提供状态完整感觉的两种技术。

有关更多信息,请参考此链接

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21136815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档