snoopy模拟登陆后采集https开头的aspx页面[转]

阅读前请看Snoopy+Https的配置文章:让Snoopy也支持HTTPS的解决办法

snoopy采集https,会调用curl模块,因为要确保安装了该模块,并且指明了路径。(snoopy默认指定的就是正确的)

构建一个表单提交
asp的站点会有些隐含的参数,要从页面中全部扣出来。

[php]$submit_url = "https://www.example.com/login.aspx";//提交页面
$formvars["DropDownList1"] = "zh-CN";
$formvars["txtAccount"] = "11111";
$formvars["txtPassword"] = "111111";
$formvars["txtLoginCode"] = $_GET[‘a’];     //填写验证码
$formvars["Button1"] = "";
            
$formvars["__EVENTTARGET"] = "";
$formvars["__EVENTARGUMENT"] = "";
$formvars["__LASTFOCUS"] = "";
$formvars["__VIEWSTATE"] = "/wEPDffUKFgICAg8QZGQWAQGS/KEtAfsT5lfgRPVAoWIJarrT2zA==";

$sp = new Snoopy;
$sp->cookies["ASP.NET_SessionId"] = $_GET[‘s’];    //设置sessionID的cookie
$sp->submit($submit_url,$formvars);          
var_dump($sp->results);//获取表单提交后的 返回的结果

if( !empty($sp->error)) {    //如果有错误,返回错误
    var_dump($sp->error);
}
[/php]

返回的信息是 Object Moved To Here;直接无视。
这时候已经登陆了,可以对要获取的页面进行采集。

[php]$geturl = ‘http://www.example.com/product/content.aspx’;    
$sp->fetch($geturl);
      
if ($sp->status != 200) {
    echo ‘no get status: ‘.$sp->status.'<br/>’;
} else {
    $file_contents = $sp->results;
    echo ‘get content:<br/>’;
    echo $file_contents;
    echo ‘<br/>’;
}
[/php]

如果你是在window环境下使用snoopy,curl会有问题,采集不到所要的内容。
建议在linux环境下进行。

你也可以用该登陆模块来实现通过程序发帖的功能,不过每次的验证码和sessionid都要自己手动填写。

曾经想过,存在cookie中的sessionid能不能通过程序读取,发现没办法跨域读取cookie。因此ff下,只能借助firebug
来查看,ie下借助httpwatch查看..

本文转自:http://hi.baidu.com/bngoogle/blog/item/1d2190103647726acb80c45a.html