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. console.log(page.content);
  19. }
  20. phantom.exit();
  21. });

上述的js代码估计应该没几个看不懂的。。。

接下来贴java代码!

  1. import org.apache.commons.io.IOUtils;
  2. import java.io.*;
  3. /**
  4. * Created with IntelliJ IDEA.
  5. * User: lsz
  6. * Date: 14-4-22
  7. * Time: 下午1:17
  8. * utils for http
  9. */
  10. public class HttpUtils {
  11. public static String getAjaxCotnent(String url) throws IOException {
  12. Runtime rt = Runtime.getRuntime();
  13. Process p = rt.exec("phantomjs.exe c:/phantomjs/codes.js "+url);//这里我的codes.js是保存在c盘下面的phantomjs目录
  14. InputStream is = p.getInputStream();
  15. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  16. StringBuffer sbf = new StringBuffer();
  17. String tmp = "";
  18. while((tmp = br.readLine())!=null){
  19. sbf.append(tmp);
  20. }
  21. //System.out.println(sbf.toString());
  22. return sbf.toString();
  23. }
  24. public static void main(String[] args) throws IOException {
  25. getAjaxCotnent("http://www.oicqzone.com");
  26. }
  27. }

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

时间: 2024-10-06 08:52:13

java调用phantomjs采集ajax加载生成的网页的相关文章

自制Javascript分页插件,支持AJAX加载和URL带参跳转两种初始化方式,可用于同一页面的多个分页和不同页面的调用

闲话部分 最近闲着实在无聊,就做了点小东西练练手,由于原来一直在用AspNetPager进行分页,而且也进行了深度的定制与原有系统整合的也不错,不过毕竟是用别人的,想着看自己能试着做出来不能,后台的分页插件已经有比较成熟的了,那就自己试着写一个前台分页吧. 话不多说,先上效果图: 优点与缺点 来说说优缺点吧,首先AspNetPager是后台分页控件,所以在向客户端回传HTML文档之前生成HTML阶段 就会把分页代码生成完毕,然后回传,而JS是前端代码,就是HTML文档在服务器组织完毕往客户端传送

使用ajax加载数据字典,生成select

//使用ajax加载数据字典,生成select //参数1: 数据字典类型 (dict_type_code) //参数2: 将下啦选放入的标签id //参数3: 生成下拉选时,select标签的name属性值 //参数4: 需要回显时,选中哪个option function loadSelect(typecode,positionId,selectname,selectedId){ //1 创建select对象,将name属性指定 var $select = $("<select name

java 调用 phantomjs

java 调用 phantomjs 2014-11-21 13:55 2034人阅读 评论(2) 收藏 举报  分类: phantomjs(2)  日前有采集需求,当我把所有的对应页面的链接都拿到手,准备开始根据链接去采集(写爬虫爬取)对应的终端页的时候,发觉用程序获取到的数据根本没有对应的内容,可是我的浏览器看到的内容明明是有的,于是浏览器查看源代码也发觉没有,此时想起该网页应该是ajax加载的.不知道ajax的小朋友可以去学下web开发啦. 采集ajax生成的内容手段不外乎两种.一种是通过h

使用jOrgChart插件, 异步加载生成组织架构图

jOrgChart插件是一个用来实现组织结构图的Jquery的插件- 一.特点 1.支持拖拽修改子节点: 2.支持节点缩放展示: 3.方便修改css定义样式: 4.超轻量型: 5.兼容性好,基本支持所有浏览器. 二.异步加载生成自上而下的组织结构图前期准备 1.通过后台查询数据库,生成树形数组结构,返回前台: 2.需要引入js 插件和css 文件 a.jquery.jOrgChart.css(插件样式自行修改) b.jquery.jOrgChart.js c. jquery.min.js d.j

(转)java类到底是如何加载并初始化的?

Java虚拟机如何把编译好的.class文件加载到虚拟机里面?加载之后如何初始化类?静态类变量和实例类变量的初始化过程是否相同,分别是如何初始化的呢?这篇文章就 是解决上面3个问题的. 若有不正之处,请多多谅解并欢迎各位能够给予批评指正,提前谢谢各位了. 1. Java虚拟机加载.class过程 虚拟机把Class文件加载到内存,然后进行校验,解析和初始化,最终形成java类型,这就是虚拟机的类加载机制.加载,验证,准备,初始化这5个阶段的顺序是确定的, 类的加载过程,必须按照这种顺序开始.这些

ajax加载菊花loading效果

Ajax异步请求的时候,一般都会利用一个动态的gif小图片来制作一个Ajax Loading,以便增加用户体验. 这里我们可以使用Spin.js,该js脚本压缩后5k,可以不用任何图片,任何外部CSS样式,就可以创建一个Ajax Loading指示器. Spin.js的在线设计.演示及下载地址为:http://fgnass.github.io/spin.js/ 我们可以在链接页面中,动态设置样式,就会自动生成样式的配置脚本: 设置之后,下图就是我们需要配置的样式: 一.显示菊花loading <

java中类与对象的加载顺序

首先了解一下Java虚拟机初始化的原理. JVM通过加装.连接和初始化一个Java类型,使该类型可以被正在运行的Java程序所使用.类型的生命周期如下图所示: 装载和连接必须在初始化之前就要完成. 类初始化阶段,主要是为类变量赋予正确的初始值.这里的"正确"初始值指的是程序员希望这个类变量所具备的起始值.一个正确的初始值是通过类变量初始化语句或者静态初始化语句给出的.初始化一个类包含两个步骤: 1) 如果类存在直接超类的话,且直接超类还没有被初始化,就先初始化直接超类. 2) 如果类存

java类到底是如何加载并初始化的?

Java虚拟机如何把编译好的.class文件加载到虚拟机里面?加载之后如何初始化类?静态类变量和实例类变量的初始化过程是否相同,分别是如何初始化的呢?这篇文章就 是解决上面3个问题的. 若有不正之处,请多多谅解并欢迎各位能够给予批评指正,提前谢谢各位了. 1. Java虚拟机加载.class过程 虚拟机把Class文件加载到内存,然后进行校验,解析和初始化,最终形成java类型,这就是虚拟机的类加载机制.加载,验证,准备,初始化这5个阶段的顺序是确定的, 类的加载过程,必须按照这种顺序开始.这些

jvm内存模型,java类从编译到加载到执行的过程,jvm内存分配过程

一.jvm内存模型 JVM 内存模型主要分为堆.程序计数器.方法区.虚拟机栈和本地方法栈 1.堆 1.1.堆是 JVM 内存中最大的一块内存空间. 1.2.该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中. 1.3.堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,最后 Survivor 由 From Survivor 和 To Survivor 组成. 2.程序计数器(Program Counter Register) 程序计数器是一块很小的内存