设为首页 收藏本站
查看: 923|回复: 0

[经验分享] 使用PHP的CURL模拟POST采集开了viewstate的asp.net网页数据

[复制链接]

尚未签到

发表于 2015-8-27 04:00:52 | 显示全部楼层 |阅读模式
  用.NET做的网站如果做成POST提交方式,且开了viewstate的话,采集起来有点小繁琐,在此跟大家分享一下做法。
  采的难点是必須先取得表單裏面的viewstate和datavalidtion兩個字段的值,並模擬POST給服務器,才能取到後面頁面的數據。由於回傳數據比較大,不能用默認的form/url-encode方法傳,要用傳文件的那個表單模式。主要代碼如下:



  1 /**
  2     QQ群:223494678
  3     函数:模拟post得到所有分页的页面信息
  4     参数:
  5         string $EVENTARGUMENT
  6         string $VIEWSTATE
  7         string $EVENTVALIDATION
  8         string $EVENTTARGET
  9     返回:
10         string
11 /**/
12 function getn($EVENTARGUMENT = "", $VIEWSTATE = "", $EVENTVALIDATION = "", $EVENTTARGET = "pager"){
13     $args = array();
14     if($EVENTARGUMENT){
15         $args = array(
16             '__EVENTTARGET'=>$EVENTTARGET,
17             '__EVENTARGUMENT'=>$EVENTARGUMENT,
18             '__VIEWSTATE'=>$VIEWSTATE,
19             '__EVENTVALIDATION'=>$EVENTVALIDATION,
20             '__VIEWSTATEENCRYPTED'=>'',
21             'search$txtFundName='=>'',
22             'search$txtFundManger'=>'',
23             'search$ddlFoundationDateOperater'=>'1',
24             'search$txtFoundationDate'=>'',
25             'search$dltFundType$ctl01$chkFundType'=>'on',
26             'search$dltFundType$ctl01$chklFundChildType$0'=>'on',
27             'search$dltFundType$ctl01$chklFundChildType$1'=>'on',
28             'search$dltFundType$ctl01$chklFundChildType$2'=>'on',
29             'search$dltFundType$ctl01$chklFundChildType$3'=>'on',
30             'search$dltFundType$ctl01$chklFundChildType$4'=>'on',
31             'search$chklFundStatus$0'=>'on',
32             'search$ddlFundOrg'=>'0',
33             'search$txtFundOrgName'=>'',
34             'search$ddlStatisticDateOperater'=>'1',
35             'search$txtStatisticDate'=>'',
36             'search$radlStatisticMode'=>'1'
37         );
38     }
39
40     $user_agent = "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11";
41
42     $ch = curl_init();
43     curl_setopt($ch, CURLOPT_URL, 'http://???/default.aspx');
44     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 设为TRUE让结果不要直接输出
45     curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
46     curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
47     curl_setopt($ch, CURLOPT_FAILONERROR, TRUE);
48     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
49     curl_setopt($ch, CURLOPT_HEADER, TRUE);
50     curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
51
52     curl_setopt($ch, CURLOPT_HTTPHEADER, array(
53     'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
54     'Accept-Language:zh-CN,zh;q=0.8',
55     'Connection: Keep-Alive',
56     'Cache-Control:max-age=0',
57     'Referer:http://???/default.aspx',
58     'Expect:'
59     ));
60
61     curl_setopt($ch, CURLOPT_POST, true); //启用POST提交
62     curl_setopt($ch, CURLOPT_POSTFIELDS, $args); //设置POST提交的字符串
63     curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);//HTTP请求User-Agent:头
64
65     $document = curl_exec($ch); //执行预定义的CURL
66     return $document;
67 }
68
69 /**
70     QQ群:223494678
71     函数:根据模拟post所得的页面信息,提取所需post的数据和分页,最后分解需要的html
72     返回:
73         string
74 /**/
75 function getHtml(){
76     global $html;
77     $first = getn();
78     preg_match('/<font color="black"><b>(\d+?)<\/b><\/font> 页<\/span>/is', $first, $matches);
79     $total = $matches[1];
80     preg_match('/<table id="dltData".+?<!-- AspNetPager/is', $first, $matches);
81     $html .= str_replace('<!-- AspNetPager', '', $matches[0]);
82     $VIEWSTATE = "";
83     $EVENTVALIDATION = "";
84     preg_match('/<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="(.+?)"/is', $first, $matches);
85     $VIEWSTATE = $matches[1];
86     preg_match('/<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="(.+?)"/is', $first, $matches);
87     $EVENTVALIDATION = $matches[1];
88     for($i = 2; $i <= $total; $i++){
89         sleep(1);
90         $EVENTARGUMENT = $i;
91         $result = getn($EVENTARGUMENT, $VIEWSTATE, $EVENTVALIDATION);
92         preg_match('/<table id="dltData".+?<!-- AspNetPager/is', $result, $matches);
93         $html .= str_replace('<!-- AspNetPager', '', $matches[0]);
94         $VIEWSTATE = "";
95         $EVENTVALIDATION = "";
96         preg_match('/<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="(.+?)"/is', $result, $matches);
97         $VIEWSTATE = $matches[1];
98         preg_match('/<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="(.+?)"/is', $result, $matches);
99         $EVENTVALIDATION = $matches[1];
100     }
101     return $html;
102 }
  
  getHtml是採集入口文件,裏面先取每一頁的數據,並提取頁碼等數據,然後循環採集後面的數據,getn是採集函數,主要是CURL模擬POST了

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104655-1-1.html 上篇帖子: 使用zend studio配置Xdebug调试PHP教程 下篇帖子: PHP正在死亡?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表