zoukankan      html  css  js  c++  java
  • java调用phantomjs采集ajax加载生成的网页

    java调用phantomjs采集ajax加载生成的网页

    日前有采集需求,当我把所有的对应页面的链接都拿到手,准备开始根据链接去采集(写爬虫爬取)对应的终端页的时候,发觉用程序获取到的数据根本没有对应的内容,可是我的浏览器看到的内容明明是有的,于是浏览器查看源代码也发觉没有,此时想起该网页应该是ajax加载的。不知道ajax的小朋友可以去学下web开发啦。
        采集ajax生成的内容手段不外乎两种。一种是通过http观察加载页面时候的请求,然后我们模仿该请求去得到对应的内容,第二种则是模仿浏览器行为去渲染这个页面得到内容。我在这里决定采用第二种方式,之前一直玩webkit,不过一直要加载页面太浪费资源了,此时了解到有一个好玩的玩意phantomjs,这是个可以用命令行来操作webkit的玩意,然后也可以直接在里面用js的api去操作页面(当然,我这边比较简单就懒得用了)。
        下载完phantomjs之后直接解压就可以使用,然后在path目录加入phantomjs的路径(以便直接在命令行就可以执行phantomjs命令)。
        接下来要完成个代码,一个是用phantomjs去获取页面(采用js编写行为),一个是采用java去调用phantomjs来达到获取内容的作用,接下来直接贴代码。
     
    1. //codes.js   
    2. system = require('system')   
    3. address = system.args[1];//获得命令行第二个参数 接下来会用到   
    4. //console.log('Loading a web page');   
    5. var page = require('webpage').create();   
    6. var url = address;   
    7. //console.log(url);   
    8. page.open(url, function (status) {   
    9.     //Page is loaded!   
    10.     if (status !== 'success') {   
    11.         console.log('Unable to post!');   
    12.     } else {   
    13.         //console.log(page.content);   
    14.         //var title = page.evaluate(function() {   
    15.         //  return document.title;//示范下如何使用页面的jsapi去操作页面的  www.oicqzone.com 
    16.         //  });   
    17.         //console.log(title);   
    18.            
    19.         console.log(page.content);   
    20.     }      
    21.     phantom.exit();   
    22. });    
     
     
    上述的js代码估计应该没几个看不懂的。。。
     
    接下来贴java代码!
     
    1. import org.apache.commons.io.IOUtils;   
    2.    
    3. import java.io.*;   
    4.    
    5. /**  
    6.  * Created with IntelliJ IDEA.  
    7.  * User: lsz  
    8.  * Date: 14-4-22  
    9.  * Time: 下午1:17  
    10.  * utils for http  
    11.  */   
    12. public class HttpUtils {   
    13.     public static String getAjaxCotnent(String url) throws IOException {   
    14.         Runtime rt = Runtime.getRuntime();   
    15.         Process p = rt.exec("phantomjs.exe c:/phantomjs/codes.js "+url);//这里我的codes.js是保存在c盘下面的phantomjs目录   
    16.         InputStream is = p.getInputStream();   
    17.         BufferedReader br = new BufferedReader(new InputStreamReader(is));   
    18.         StringBuffer sbf = new StringBuffer();   
    19.         String tmp = "";   
    20.         while((tmp = br.readLine())!=null){   
    21.             sbf.append(tmp);   
    22.         }   
    23.         //System.out.println(sbf.toString());   
    24.         return sbf.toString();   
    25.     }   
    26.    
    27.     public static void main(String[] args) throws IOException {   
    28.         getAjaxCotnent("http://www.oicqzone.com");   
    29.     }   
    30. }   
     
     
    其实原理很简单,就是通过进程间通信用java调用phantomjs这个组件去请求渲染页面,不过这种做法因为每次都要重新启动phantomjs进程,所以比较慢,还有另外一种直接用phantomjs加载页面后,把内容post给我们自定义的一个http后端接收数据,会更快一点。
  • 相关阅读:
    什么是 bean 的自动装配?
    什么是 Spring 的内部 bean?
    什么是 Spring 的 MVC 框架?
    Spring AOP and AspectJ AOP 有什么区别?
    解释 JDBC 抽象和 DAO 模块?
    volatile 类型变量提供什么保证?
    一个 Spring Bean 定义 包含什么?
    什么是 Spring MVC 框架的控制器?
    使用 Spring 访问 Hibernate 的方法有哪些?
    什么是 Callable 和 Future?
  • 原文地址:https://www.cnblogs.com/firstdream/p/5119720.html
Copyright © 2011-2022 走看看