Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.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中的POST变量抓取ASP.Net网站_Php_Asp.net_Screen Scraping - Fatal编程技术网

用PHP中的POST变量抓取ASP.Net网站

用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

在过去的几天里,我一直在努力抓取一个网站,但到目前为止没有运气

情况如下: 我正在努力搜集的网站需要以前提交的表单中的数据。我已经识别出web应用程序所需的变量,并调查了原始web应用程序发送的HTTP头

因为我对ASP.net几乎一无所知,所以我想我应该问问自己是否遗漏了一些东西

我尝试过不同的方法(CURL、get contents和Snoopy类),下面是我的CURL方法代码:

<?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
当我研究我编写的CURL脚本的头时,不知何故没有生成表单数据请求。请求方法也没有设置为POST。在我看来,这就是事情出错的地方,但我不知道

感谢您的帮助


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

由于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时这是否正常。