Java爬虫——phantomjs抓取ajax动态加载网页

(说好的第二期终于来了 >_<)

1、phantomjs介绍

phantomjs实现了一个无界面的webkit浏览器。虽然没有界面,但dom渲染、js运行、网络访问、canvas/svg绘制等功能都很完备,在页面抓取、页面输出、自动化测试等方面有广泛的应用。

官网:http://phantomjs.org/

2问题分析

上期采用CloseableHttpClient未能抓取到我们想要的天猫价格,是因为这个价格是ajax动态加载的。现在有了phantomjs,它本身就是个浏览器,可以执行js , 返回ajax请求执行完后的网页。这样我们就可以得到我们想要的价格了。

3、操作步骤

(1)官网下载phantomjs,无需安装,解压即可使用。

( 2 )编写js文件

     以我们要抓取的天猫价格为例,参考官方api,编写代码如下:

(Crawl2.js:)   

varurl='https://detail.tmall.com/item.htm?spm=a222t.7794920.fdigt.15.toj3Lg&id=522169321891&skuId=3201261540546&rn=870e70c02239d3cf10b156e9f9aa9e4f&scm=search-api.3c_fp.870e70c02239d3cf10b156e9f9aa9e4f.2';

 

 

var page =require('webpage').create();

page.settings.userAgent= 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR2.0.50727)';

//console.log('Thedefault user agent is ' + page.settings.userAgent);

 

page.open(url,function (status) {

    if (status !== 'success') {

        console.log('Unable to access thewebsite');

    } else {

    

     

            var val = page.evaluate(function(){

             

                returndocument.querySelector('div.tm-promo-price span.tm-price').innerHTML;

            });

            console.log('The register address:' + val);

            phantom.exit();

         };

});

用phantomjs命令执行此文件,即可打印出价格。

(3)在java中调用

packageedu.nju.opsource.nhandan;

 

import org.apache.commons.io.IOUtils;  

 

importjava.io.*;  

public classHttpUtils {  

    public staticString getAjaxCotnent(String url)throwsIOException {  

        Runtime rt =Runtime.getRuntime();

        Process p = rt.exec("phantomjs.exeD:/phantomjsFile/crawl2.js ");

     InputStream is = p.getInputStream();  

        BufferedReader br = newBufferedReader(new InputStreamReader(is));  

        StringBuffer sbf = newStringBuffer();  

        String tmp = "";  

        while((tmp =br.readLine())!=null){  

            sbf.append(tmp);  

        }  

        System.out.println(sbf.toString());  

        return sbf.toString();  

    }  

  

    public static voidmain(String[] args) throws IOException{  

        getAjaxCotnent("");  

    }  

}  

输出结果:

 The register address: 3996.00

至此,成功获取到数据,amazing!!!

 

(既然phantomjs可以运行模拟点击事件,那么像那种点击“加载更多”才出现更多内容的信息,不就可以通过不断地模拟点击“加载更多”按钮来获取所有信息,最后只爬取一次,将所有内容都抓下来么??同样留一坑,下期来讲---Java爬虫——抓取“加载更多”内容)

 

 

 

 

 

 

你可能感兴趣的:(java)