使用PHP的CURL模拟POST采集开了viewstate的asp.net网页数据
用.NET做的网站如果做成POST提交方式,且开了viewstate的话,采集起来有点小繁琐,在此跟大家分享一下做法。
采的难点是必須先取得表單裏面的viewstate和datavalidtion兩個字段的值,並模擬POST給服務器,才能取到後面頁面的數據。由於回傳數據比較大,不能用默認的form/url-encode方法傳,要用傳文件的那個表單模式。主要代碼如下:
/**
QQ群:223494678
函数:模拟post得到所有分页的页面信息
参数:
string $EVENTARGUMENT
string $VIEWSTATE
string $EVENTVALIDATION
string $EVENTTARGET
返回:
string
/**/
function getn($EVENTARGUMENT = "", $VIEWSTATE = "", $EVENTVALIDATION = "", $EVENTTARGET = "pager"){
$args = array();
if($EVENTARGUMENT){
$args = array(
'__EVENTTARGET'=>$EVENTTARGET,
'__EVENTARGUMENT'=>$EVENTARGUMENT,
'__VIEWSTATE'=>$VIEWSTATE,
'__EVENTVALIDATION'=>$EVENTVALIDATION,
'__VIEWSTATEENCRYPTED'=>'',
'search$txtFundName='=>'',
'search$txtFundManger'=>'',
'search$ddlFoundationDateOperater'=>'1',
'search$txtFoundationDate'=>'',
'search$dltFundType$ctl01$chkFundType'=>'on',
'search$dltFundType$ctl01$chklFundChildType$0'=>'on',
'search$dltFundType$ctl01$chklFundChildType$1'=>'on',
'search$dltFundType$ctl01$chklFundChildType$2'=>'on',
'search$dltFundType$ctl01$chklFundChildType$3'=>'on',
'search$dltFundType$ctl01$chklFundChildType$4'=>'on',
'search$chklFundStatus$0'=>'on',
'search$ddlFundOrg'=>'0',
'search$txtFundOrgName'=>'',
'search$ddlStatisticDateOperater'=>'1',
'search$txtStatisticDate'=>'',
'search$radlStatisticMode'=>'1'
);
} $user_agent = "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11"; $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://???/default.aspx');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 设为TRUE让结果不要直接输出
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($ch, CURLOPT_FAILONERROR, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE); curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language:zh-CN,zh;q=0.8',
'Connection: Keep-Alive',
'Cache-Control:max-age=0',
'Referer:http://???/default.aspx',
'Expect:'
)); curl_setopt($ch, CURLOPT_POST, true); //启用POST提交
curl_setopt($ch, CURLOPT_POSTFIELDS, $args); //设置POST提交的字符串
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);//HTTP请求User-Agent:头 $document = curl_exec($ch); //执行预定义的CURL
return $document;
} /**
QQ群:223494678
函数:根据模拟post所得的页面信息,提取所需post的数据和分页,最后分解需要的html
返回:
string
/**/
function getHtml(){
global $html;
$first = getn();
preg_match('/<font color="black"><b>(\d+?)<\/b><\/font> 页<\/span>/is', $first, $matches);
$total = $matches[1];
preg_match('/<table id="dltData".+?<!-- AspNetPager/is', $first, $matches);
$html .= str_replace('<!-- AspNetPager', '', $matches[0]);
$VIEWSTATE = "";
$EVENTVALIDATION = "";
preg_match('/<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="(.+?)"/is', $first, $matches);
$VIEWSTATE = $matches[1];
preg_match('/<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="(.+?)"/is', $first, $matches);
$EVENTVALIDATION = $matches[1];
for($i = 2; $i <= $total; $i++){
sleep(1);
$EVENTARGUMENT = $i;
$result = getn($EVENTARGUMENT, $VIEWSTATE, $EVENTVALIDATION);
preg_match('/<table id="dltData".+?<!-- AspNetPager/is', $result, $matches);
$html .= str_replace('<!-- AspNetPager', '', $matches[0]);
$VIEWSTATE = "";
$EVENTVALIDATION = "";
preg_match('/<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="(.+?)"/is', $result, $matches);
$VIEWSTATE = $matches[1];
preg_match('/<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="(.+?)"/is', $result, $matches);
$EVENTVALIDATION = $matches[1];
}
return $html;
}
getHtml是採集入口文件,裏面先取每一頁的數據,並提取頁碼等數據,然後循環採集後面的數據,getn是採集函數,主要是CURL模擬POST了
使用PHP的CURL模拟POST采集开了viewstate的asp.net网页数据的更多相关文章
- PHP curl模拟浏览器采集阿里巴巴的实现代码
<?php set_time_limit(0); function _rand() { $length=26; $chars = "0123456789abcdefghijklmnop ...
- 使用curl模拟ip和来源进行网站采集的实现方法
对于限制了ip和来源的网站,使用正常的采集方式是不行的.本文将介绍一种方法,使用php的curl类实现模拟ip和来源,实现采集限制ip和来源的网站. 1.设置页面限制ip和来源访问 server.ph ...
- curl模拟ip和来源进行网站采集的实现方法
对于限制了ip和来源的网站,使用正常的采集方式是不行的.这里说我的一种方法吧,使用php的curl类实现模拟ip和来源,可以实现采集限制ip和来源的网站. 1.设置页面限制ip和来源访问比如服务端的s ...
- curl模拟自动登陆&采集网页数据
<!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content=&quo ...
- php中curl模拟浏览器来传输数据
cURL可以使用URL的语法模拟浏览器来传输数据, 因为它是模拟浏览器,因此它同样支持多种协议,FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以 ...
- php curl模拟post请求提交数据
最近在做校园图书馆图书信息的采集程序,既然是图书馆图书的采集,肯定有提交搜索的页面,无非是post提交,让我想到了curl模拟提交,首先通过firebug进行抓包查询下post提交后的格式如下: tx ...
- [PHP自动化-进阶]004.Snoopy VS CURL 模拟Discuz.net登陆
引言:采集论坛第一步就是要模拟登陆,由于各个站点登录表单各不相同,验证方式又是多种多样,所以直接提交用户名密码到登录页面就比较繁琐. 所以我们采用cookie来模拟登陆无疑是最佳捷径. 今天我们要处理 ...
- CURL 模拟http提交
1:CURL模拟get提交 private function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETUR ...
- PHP 之 CURL 模拟登陆并获取数据
1.CURL模拟登陆的流程和步骤 2.tempnam 创建一个临时文件 3.使用CURL模拟登陆到PHP100论坛 <?php $cookie_file = tempnam('./temp',' ...
随机推荐
- DNS劫持和DNS污染的区别
我们知道,某些网络运营商为了某些目的,对DNS进行了某些操作,导致使用ISP的正常上网设置无法通过域名取得正确的IP地址.常用的手段有:DNS劫持和DNS污染. 什么是DNS劫持 DNS劫持就是通过劫 ...
- RecycleView在eclipse的初体验
在sdk中找到v7包 \sdk\extras\android\support\v7\recyclerview 导入工程 Import\Android\Existing Android Code Int ...
- zt-Simple source policy routing
原文地址: http://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.rpdb.simple.html Linux Advanced Routing & Tr ...
- window 2003 配置FTP +防火墙设置
2保险的做法是 不允许匿名登录,吧钩去掉 后面我们会添加一个用户,并且赋予权限 3 主目录 可以设置时当前计算机目录或者是另一台计算机目录(映射) FTP站点目录:浏览定位FTP文件所在站点,给予是否 ...
- 用JS制作简易选项卡
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 30.0px Consolas; color: #2b7ec3 } p.p2 { margin: 0.0px ...
- Selenium WebDriver使用IE浏览器
摘:http://www.cnblogs.com/dream0577/archive/2012/10/07/2714579.html /** 用IE驱动,1.先到官网下载IEDriverS ...
- JS 将字符串转换成日期类型
将字符串形式的日期转换成日期对象 var strTime="2011-04-16"; //字符串日期格式 var date= new Date(Date.par ...
- HTML锁定Table中某一列
1. 2. 3. function ChangeTable() { var type = document.getElementById("ddl_ReportType").val ...
- 检测网页地址有效性java代码
package com.inspur.linkcheck; import java.io.IOException; import java.net.HttpURLConnection; import ...
- 不制作证书是否能加密SQLSERVER与客户端之间传输的数据?
不制作证书是否能加密SQLSERVER与客户端之间传输的数据? 在做实验之前请先下载network monitor抓包工具 微软官网下载:http://www.microsoft.com/en-us/ ...