使用PHP中的POST变量刮擦ASP.Net网站

时间:2010-09-09 17:34:42

标签: php asp.net screen-scraping

过去几天我一直试图抓一个网站,但到目前为止没有运气。

情况如下: 我试图抓取的网站需要先前提交的表格中的数据。我已经识别了Web应用程序所需的变量,并调查了原始Web应用程序发送的HTTP标头。

由于我在ASP.net中几乎没有任何知识,所以我想问我是否在这里遗漏了一些东西。

我尝试了不同的方法(CURL,获取内容和Snoopy类),这是我的卷曲方法代码:

<?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;
?>

请求了以下标头:

请求标题

  • 接受:应用/ XML,应用/ XHTML + xml的,text / html的; Q = 0.9,文本/无格式; Q = 0.8,图像/ PNG, / 的; Q = 0.5
  • 内容类型:应用/ X WWW的窗体-urlencoded
  • User-Agent:Mozilla / 5.0(Macintosh; U; Intel Mac OS X 10_6_4; EN-US) AppleWebKit / 533.18.1(KHTML,喜欢 Gecko)版本/ 5.0.2 Safari / 533.18.5

表格数据

  • 很多表单字段

响应标头

  • 缓存控制:私人
  • 的Content-Length:30168
  • 的Content-Type:text / html的;字符集= UTF-8
  • 日期:2010年9月9日星期四17:22:29 GMT
  • 服务器:IIS / 6.0
  • X-ASPNET-版本:2.0.50727
  • X供电-通过:ASP.NET

当我调查我编写的CURL脚本的标题时,不知何故不会生成表单数据请求。请求方法也不设置为POST。这就是我在哪里出错的地方,但不知道。

任何帮助表示赞赏!!!

编辑:我忘了提到抓取的结果是远程网站的自定义会话过期页面。

3 个答案:

答案 0 :(得分:1)

由于__VIEWSTATE__EVENTVALIDATION是基本的64个字符数组,我在这些字段中使用了urlencode()

$fields = array('__VIEWSTATE' => urlencode( $averylongvar ),
                '__EVENTVALIDATION' => urlencode( $anotherverylongvar),
                'A few' => 'other variables');

对我来说很好。

答案 1 :(得分:0)

由于VIEWSTATE包含特定情况下页面的状态(并且所有这些状态都被编码成一个很大的,显然是凌乱的字符串),你无法确定你正在抓取的参数对于你的“模拟”是一样的“请求(我很确定它不能相同;)。”。

如果你真的需要处理VIEWSTATE和EVENTVALIDATION参数,我的建议是采用另一种方法,即通过Selenium或HtmlUnit类似的库来抓取内容(但不幸的是我不知道PHP中是否有类似内容) 。

答案 2 :(得分:0)

我猜网站需要在浏览器中呈现。您是否尝试使用iMacrosWatir等工具?