使用phantomjs抓取JS动态生成的页面

关于phantomjs

phantomjs实现了一个无界面的webkit浏览器。虽然没有界面,但dom渲染、js运行、网络访问等API都很完整。可以利用phantomjs来下载js生成的页面。

下载phantomjs(http://phantomjs.org/download.html)。解压到任意目录,在Windows下将包含phantomjs.exe的目录添加到系统路径。Linux下 phantomjs2.0还没有提供下载的包,需要手动编译。centos 安装phantomjs步骤如下:

在CentOS 6上测试可行。

代码块语法遵循标准markdown代码,例如:

sudo yum -y install gcc gcc-c++ make flex bison gperf ruby   openssl-devel freetype-devel fontconfig-devel libicu-devel sqlite-devel   libpng-devel libjpeg-devel

下载进行编译:

git clone git://github.com/ariya/phantomjs.git
cd phantomjs
git checkout 2.0
./build.sh

使用示例

  • 示例一

    由于PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API,若要直接使用则需要js脚本进行调用。

    使用phantomjs去获取页面,然后用Java调用phantomjs来获取内容。

    codes.js 代码:

system = require(‘system‘)
address = system.args[1];//获得命令行第二个参数 接下来会用到
//console.log(‘Loading a web page‘);
var page = require(‘webpage‘).create();
var url = address;
//console.log(url);
page.open(url, function (status) {
    //Page is loaded!
    if (status !== ‘success‘) {
        console.log(‘Unable to post!‘);
    } else {
        //console.log(page.content);
        //var title = page.evaluate(function() {
        //  return document.title;//示范下如何使用页面的jsapi去操作页面的  www.oicqzone.com
        //  });
        //console.log(title);   

        console.log(page.content);
    }
    phantom.exit();
});

java调用代码:

public static void getContent(String url) throws IOException {
    Runtime rt = Runtime.getRuntime();
    //这里的codes.js是保存在D盘下面的phantomjs目录中
    Process p = rt.exec("D:/phantomjs-2.0.0-windows/bin/phantomjs.exe D:/phantomjs/codes.js "+url);
    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());
} 
  • 示例二

    上一博文中介绍了selenium。现在有了phantomjs,就可以使用selenium来运行ghostdriver了。思路和运行chromedriver一样,只是ghostdriver可以驱动phantomjs。现在ghostdriver Java包已经和phantomjs绑定一起了,只要安装ghostdriver就可以使用了。如下添加maven依赖

<dependency>
   <groupId>com.github.detro</groupId>
   <artifactId>phantomjsdriver</artifactId>
   <version>1.2.0</version>
  </dependency>

使用的方法和selenium的其它驱动类似。因为是驱动第三方进程进行解析,而创建进程的开销还是比较大的,所以应尽量对webDriver进行复用会比较好。

一些问题

再启动应用的时候,有些机器中出现如下的异常信息,

org.openqa.selenium.remote.UnreachableBrowserException: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure.
org.openqa.selenium.net.UrlChecker$TimeoutException: Timed out waiting for [http://localhost:65377/status] to be available after 20000 ms

可能是tcp端口遭到占用,或者是driver版本和phantomjs版本不兼容所致。经过测试,有些机器中ghostdriver目前的版本驱动不了phantomjs2.0,把phantomjs降低一个版本就好使了。如phantomjs1.9.8。

参考:http://blog.csdn.net/tengdazhang770960436/article/details/41348035

PhantomJSDriver文档:https://cdn.rawgit.com/detro/ghostdriver/master/binding/java/docs/javadoc/index.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 19:07:18

使用phantomjs抓取JS动态生成的页面的相关文章

使用selenium抓取JS动态生成的页面

在抓取网页数据时,传统jsoup方案只能对静态页面有效,而有些网页数据往往是js生成的,所以这时候需要其它的方案. 首先的思路是分析js程序,对js的请求进行再次抓取,这适合于特定的页面抓取,要做到对不同目标URL的通用性,比较麻烦. 第二种思路,也是比较成熟的做法是利用第三方的驱动渲染页面,然后下载.这里介绍一下第二种实现思路. Selenium是一个模拟浏览器的自动化测试工具,它提供一组API可以与真实的浏览器内核交互. Java环境下的maven配置如下: <dependency> &l

抓取js动态生成数据

最近在抓数据,一般的网页数据抓取相对容易一些,今天在抓电视猫的节目单,发现有些数据时抓取不到的,Java端得到的HTML文件里面没有某一段代码,查了很多资料,发现说是js动态生成的数据,无法直接抓取,有一种解决方法是利用找到ajax请求地址和参数,重新抓取,该方法存在一个问题,就是当参数被加密过时,该方法就不好用了,所以,这里用了一个办法,就是利用HTMLunit来抓取(可以利用jsuop来处理HTML文件),jar包下载地址:http://download.csdn.net/detail/jo

PHP 爬虫体验(三) - 使用PHP + puppeteer爬取js动态渲染的页面内容

之前写的两篇爬虫体验基本上涵盖了一般的Html页面提取场景,但是有些时候,如果目标页面不是纯静态的页面,而是使用js动态渲染的页面(比如one),之前的爬虫就不好使了,这种时候就要借助一些其他工具来进行实现. 一般爬取动态页面的思路是通过软件模拟浏览器行为获取到渲染后的页面镜像,然后再对渲染后的页面进行分析,常用的工具有selenium,phantomJs,puppeteer等,通过对项目维护程度.对PHP友好度的对比,我选用的是puppeteer. 根据官方介绍,谷歌在2017年开发了自家Ch

[搬运自我的CSDN博客] python抓取javascript动态生成HTML内容的实践

<注:CSDN博客在美国访问特别卡,所以转移到cnblogs来发文章> 本实验在Ubuntu14.04上完成.使用的浏览器是火狐(Firefox 33.0),python版本是2.7.6. 大家都知道用urllib配合正则表达式抓取静态HTML的内容很方便,但是如果网页中有javascript动态生成的内容,urllib就无能为力了. 此时我们要借助一个额外的工具:selenium.它的工作原理是操纵(火狐)浏览器浏览目标网页,等待网页中的javascript全部执行完毕后再对HTML源码进行

HtmlUnit爬取Ajax动态生成的页面内容

HtmlUnit说白了就是一个浏览器,这个浏览器是用Java写的无界面的浏览器,正因为其没有界面,因此执行的速度还是可以滴. HtmlUnit提供了一系列的API,这些API可以干的功能比较多,如表单的填充,表单的提交,模仿点击链接,由于内置了Rhinojs引擎,因此可以执行JavaScript 之前用的时候一直抓取不了Ajax动态生成table及其数据,用Firefox和IE浏览器查看网页源代码也看不到table和数据,但是用Firefox查看元素能看到信息 调研了HtmlUnit好久都没有用

如何用phantomjs去抓取js渲染后的页面

1.安装phantomjs 网上有很多. 2.执行官网上的示例代码 // Read the Phantom webpage '#intro' element text using jQuery and "includeJs" "use strict"; var page = require('webpage').create(); page.onConsoleMessage = function(msg) { console.log(msg); }; page.op

Python爬虫学习——使用selenium和phantomjs爬取js动态加载的网页

1.安装selenium pip install selenium Collecting selenium Downloading selenium-3.4.1-py2.py3-none-any.whl (931kB) 100% |████████████████████████████████| 942kB 573kB/s Installing collected packages: selenium Successfully installed selenium-3.4.1 2.安装phan

2)JS动态生成HTML元素的爬取

2)JS动态生成HTML元素的爬取 import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import cn.edu.hfut.dmic.webcollector.crawler.DeepCrawler; import cn.edu.hfut.dmic.webcollector.model.

使用Ghost.py爬取由JS动态生成的网页

很多网站的内容是由JS动态生成的,对于这样的网站查看它的源代码是看不出什么的,常规的爬虫对于这样的网站束手无策.我自己做了一个由JS生成的图片,并成功的用Ghost.py把它爬取了下来. 对于这么个图片看似平常,那么看下它的源代码 从源代码里看不出关于这张图片的地址,而图片的地址是在后端,由JS加载进去的,爬取这类网站需要模拟浏览器执行JS语句,得到执行JS后的页面,再实现爬取. 这里需要用到一个工具:ghost.py ghost.py是一个使用python编写的封装了webkit的网络工具.官