利用Simple HTML DOM抓取网页过程中遇到了asp.net开发的网站,它不改变url的情况下通过Post提交分页请求,并没有在url上直接反映出分页信息,另外Simple HTML DOM在官方介绍中也没有提及模拟Post请求,不过查看了它的代码后,它可以接受Stream Context作为第三个参数。
12345678910111213 $request = array('http' => array('method' => 'POST','content' => http_build_query(array('Item' => 'Value','Item2' => 'Value2')),));$context = stream_context_create($request);$html = file_get_html('http://www.google.com', false, $context);
此外,ASP.NET网页翻页可以注意到它的三个重要参数:
- __VIEWSTATE ,这个应该是.net特有的,如果你再firebug中发现了它,并且他的值是一堆字符,这是.net的网站也没差了;
- __doPostBack方法,这个是asp.net页面自动生成一个javascript方法,包含两个参数,__EVENTTARGET,__EVENTARGUMENT,这两个参数可以参看页码对应的内容,因为点击翻页的时候,会将页码信息传给这两个参数;
- __EVENTVALIDATION参数
所以在模拟Post请求时,只要带上这三个参数即可。
下面就是PHP利用Simple HTML DOM网页抓取工具类,模拟Post请求,对ASP.NET网页进行翻页抓取的例子,其中__EVENTTARGET,__EVENTARGUMENT,__VIEWSTATE这三个参数不可少
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$viewstate = ***; for($i=1; $i<=1000 $i++){ $request = array( 'http' => array( 'method' => 'POST', 'content' => http_build_query(array( '__EVENTTARGET' => 'AspNetPager1', '__EVENTARGUMENT' => $i, '__VIEWSTATE' => $viewstate, )), ) ); $context = stream_context_create($request); $url = "http://www.google.com"; $html = file_get_html($url, false, $context); |
Done!
4条评论
其实这方面我不是这专业的,我更希望有相关专业的同学能给出相对完
其实这方面我不是这专业的,我更希望有相关专业的同学能给出相对完
其实这方面我不是这专业的,我更希望有相关专业的同学能给出相对完
其实这方面我不是这专业的,我更希望有相关专业的同学能给出相对完