采集ajax加载生成的网页

来源:互联网 发布:联通网络信号怎么样 编辑:程序博客网 时间:2024/05/01 05:41

方案: phantomjs + js + java .


phantomjs

PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API。它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。 PhantomJS 可以用于 页面自动化 , 网络监测 , 网页截屏 ,以及 无界面测试 等。


下载完phantomjs之后直接解压就可以使用,然后在path目录加入phantomjs的路径(以便直接在命令行就可以执行phantomjs命令)。 接下来要完成个代码,一个是用phantomjs去获取页面(采用js编写行为),一个是采用java去调用phantomjs来达到获取内容的作用,接下来直接贴代码。


//codes.js   system = require('system')   address = system.args[1];//获得命令行第二个参数 接下来会用到    var page = require('webpage').create();   var url = address;      page.open(url, function (status) {       //Page is loaded!       if (status !== 'success') {           console.log('Unable to post!');       } else {              console.log(page.content);       }          phantom.exit();   }); 


import org.apache.commons.io.IOUtils;      import java.io.*;      /**   * Created with IntelliJ IDEA.   * User: lsz   * Date: 14-4-22   * Time: 下午1:17   * utils for http   */   public class HttpUtils {       public static String getAjaxCotnent(String url) throws IOException {           Runtime rt = Runtime.getRuntime();           Process p = rt.exec("phantomjs.exe c:/phantomjs/codes.js "+url);//这里我的codes.js是保存在c盘下面的phantomjs目录           InputStream is = p.getInputStream();           BufferedReader br = new BufferedReader(new InputStreamReader(is));           StringBuffer sbf = new StringBuffer();           String tmp = "";           while((tmp = br.readLine())!=null){               sbf.append(tmp);           }           //System.out.println(sbf.toString());           return sbf.toString();       }          public static void main(String[] args) throws IOException {           getAjaxCotnent("http://m.daojia.com");       }   }   



其实原理很简单,就是通过进程间通信用java调用phantomjs这个组件去请求渲染页面,不过这种做法因为每次都要重新启动phantomjs进程,所以比较慢,还有另外一种直接用phantomjs加载页面后,把内容post给我们自定义的一个http后端接收数据,会更快一点。


0 0
原创粉丝点击