前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java爬虫——phantomjs抓取ajax动态加载网页

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

作者头像
一头小山猪
发布2020-04-10 10:11:31
2.6K0
发布2020-04-10 10:11:31
举报
文章被收录于专栏:微光点亮星辰微光点亮星辰

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:)

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) {

代码语言:javascript
复制
    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爬虫——抓取“加载更多”内容)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微光点亮星辰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档