用PHP中的POST变量抓取ASP.Net网站
在过去的几天里,我一直在努力抓取一个网站,但到目前为止没有运气 情况如下: 我正在努力搜集的网站需要以前提交的表单中的数据。我已经识别出web应用程序所需的变量,并调查了原始web应用程序发送的HTTP头 因为我对ASP.net几乎一无所知,所以我想我应该问问自己是否遗漏了一些东西 我尝试过不同的方法(CURL、get contents和Snoopy类),下面是我的CURL方法代码:用PHP中的POST变量抓取ASP.Net网站,php,asp.net,screen-scraping,Php,Asp.net,Screen Scraping,在过去的几天里,我一直在努力抓取一个网站,但到目前为止没有运气 情况如下: 我正在努力搜集的网站需要以前提交的表单中的数据。我已经识别出web应用程序所需的变量,并调查了原始web应用程序发送的HTTP头 因为我对ASP.net几乎一无所知,所以我想我应该问问自己是否遗漏了一些东西 我尝试过不同的方法(CURL、get contents和Snoopy类),下面是我的CURL方法代码: <?php $url = 'http://www.urltowebsite.com/Default.asp
<?php
$url = 'http://www.urltowebsite.com/Default.aspx';
$fields = array('__VIEWSTATE' => 'averylongvar',
'__EVENTVALIDATION' => 'anotherverylongvar',
'A few' => 'other variables');
$fields_string = http_build_query($fields);
$curl = curl_init($url);
curl_setopt_array
(
$curl,
array
(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => 0, // Not supported in PHP
CURLOPT_SSL_VERIFYHOST => 0, // at this time.
CURLOPT_HTTPHEADER =>
array
(
'Content-type: application/x-www-form-urlencoded; charset=utf-8',
'Set-Cookie: ASP.NET_SessionId='.uniqid().'; path: /; HttpOnly'
),
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $fields_string,
CURLOPT_FOLLOWLOCATION => 1
)
);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
请求了以下标题:
<?php
$url = 'http://www.urltowebsite.com/Default.aspx';
$fields = array('__VIEWSTATE' => 'averylongvar',
'__EVENTVALIDATION' => 'anotherverylongvar',
'A few' => 'other variables');
$fields_string = http_build_query($fields);
$curl = curl_init($url);
curl_setopt_array
(
$curl,
array
(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => 0, // Not supported in PHP
CURLOPT_SSL_VERIFYHOST => 0, // at this time.
CURLOPT_HTTPHEADER =>
array
(
'Content-type: application/x-www-form-urlencoded; charset=utf-8',
'Set-Cookie: ASP.NET_SessionId='.uniqid().'; path: /; HttpOnly'
),
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $fields_string,
CURLOPT_FOLLOWLOCATION => 1
)
);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
- 请求URL:
- 申请方式:邮寄
- 状态代码:200 OK
- 接受:application/xml、application/xhtml+xml、text/html;q=0.9,文本/普通;q=0.8,图像/png,/;q=0.5
- 内容类型:application/x-www-form-urlencoded
- 用户代理:Mozilla/5.0(Macintosh;U; 英特尔Mac OS X 10_6_4;en us) AppleWebKit/533.18.1(KHTML,如 Gecko)版本/5.0.2 Safari/533.18.5
- 很多表单字段
- 缓存控制:专用
- 内容长度:30168
- 内容类型:text/html;字符集=utf-8
- 日期:2010年9月9日星期四格林尼治标准时间17:22:29
- 服务器:Microsoft IIS/6.0
- X-Aspnet-Version:2.0.50727
- X-Powered-By:ASP.NET
编辑:我忘了提到,刮取的结果是远程网站的自定义会话过期页面。由于VIEWSTATE包含特定情况下页面的状态(并且所有这些状态都被编码为一个大的、看起来很凌乱的字符串),您无法确定刮取的参数是否与“模拟”相同请求(我很确定它不可能是相同的;))
如果您真的需要处理VIEWSTATE和EVENTVALIDATION参数,我的建议是遵循另一种方法,即通过Selenium或类似HtmlUnit的库(但不幸的是,我不知道PHP中是否有类似的内容) 由于
\uuuu VIEWSTATE
和\uuuu EVENTVALIDATION
是基本的64字符数组,我对这些字段使用了urlencode()
:
$fields = array('__VIEWSTATE' => urlencode( $averylongvar ),
'__EVENTVALIDATION' => urlencode( $anotherverylongvar),
'A few' => 'other variables');
对我来说效果很好。Mamoo,谢谢你的回复,在我的帖子中,我忘了提到刮取的结果是远程网站的自定义会话过期页面。至于Viewstate和eventvalidation,我刷新了页面数百万次,这些变量似乎没有改变,因此我在POST变量中使用了相同的变量。事实上,当我更改这两个变量中的一个小字符时,网站返回了一个错误。现在更清楚了,在这种情况下,ASP没有多大区别。也许你的标题或参数中还缺少一些东西…谢谢mamoo,这确实很奇怪。但我几乎尝试了一切,我重新创建了一个单独的html表单,提交到原始url,一切顺利。我添加了相同的cookie头,但没有成功解决。我唯一不确定的是,我在标题中根本看不到任何表单数据。不知道使用CURL时这是否正常。