Java爬虫——phantomjs抓取ajax动态加载网页
(说好的第二期终于来了>_<)
1、phantomjs介绍
phantomjs实现了一个无界面的webkit浏览器。虽然没有界面,但dom渲染、js运行、网络访问、canvas/svg绘制等功能都很完备,在页面抓取、页面输出、自动化测试等方面有广泛的应用。
2、问题分析
上期采用CloseableHttpClient未能抓取到我们想要的天猫价格,是因为这个价格是ajax动态加载的。现在有了phantomjs,它本身就是个浏览器,可以执行js , 返回ajax请求执行完后的网页。这样我们就可以得到我们想要的价格了。
3、操作步骤
(1)官网下载phantomjs,无需安装,解压即可使用。
( 2 )编写js文件
以我们要抓取的天猫价格为例,参考官方api,编写代码如下:
(Crawl2.js:)
var url='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;
import java.io.*;
publicclass HttpUtils{
publicstatic String getAjaxCotnent(String url) throws IOException{
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("phantomjs.exe D:/phantomjsFile/crawl2.js ");
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());
returnsbf.toString();
}
publicstaticvoid main(String[] args) throws IOException{
getAjaxCotnent("");
}
}
输出结果:
至此,成功获取到数据,amazing!!!
(既然phantomjs可以运行模拟点击事件,那么像那种点击“加载更多”才出现更多内容的信息,不就可以通过不断地模拟点击“加载更多”按钮来获取所有信息,最后只爬取一次,将所有内容都抓下来么??同样留一坑,下期来讲---Java爬虫——抓取“加载更多”内容)