以下是我学习使用phantomjs爬虫的打怪升级之路,过程充满艰辛,也充满欢乐,但一路的风景就是最大的乐趣,不是么?希望大家能get到想要的东西!
安装phantomjs
- 自行下载安装 phantomjs官网
- phantomjs使用案例 案例 看看使用案例
实战爬虫
这里主要用到phantomjs的两个模块,分别是
webserver
、webpage
。用这两个模块开发一个独立的web服务。
设计思路
java通过http请求下发任务,phantomjs webservice获取任务后去处理,处理完以后再将结果返回给java。需要注意的是目前一个phantomjs webservice只支持10个并发。但我们可以在一台服务器上多开几个phantomjs webservice启用不同的端口即可,或者可以多台服务器做个集群,用nginx做反向代理。
phantomjs webservice server.js
phantom.outputEncoding = 'gbk';
var webserver = require("webserver");
var webPage = require("webpage");
var server = webserver.create()
var count = 0;
var service = server.listen(8888, function(request, response) {
var url = "https://item.m.jd.com/product/";
var skuCodeArg = request.post;
var code = skuCodeArg.substr(8,skuCodeArg.length);
// 退出服务
if(code == "goDie"){
console.log("phantomjs quit");
response.statusCode = 200;
response.write("phantomjs quit");
phantom.exit();
return false;
}
url = url + code + ".html";
console.log("count "+(++count)+" url "+url);
var page = webPage.create();
page.settings.userAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36";
page.settings.loadImages = true;
page.settings.clearMemoryCaches = true;
page.clearMemoryCache();
page.open(url, function start(status) {
if (status == "success") {
content = page.content;
response.statusCode = 200;
response.write(content);
response.close();
//这个setTimeout必须要加,不然会出现内存耗尽的提示,程序直接退出。
setTimeout(function() {
setTimeout(function() {
page.close();
}, 1);
}, 100);
} else {
response.statusCode = 500;
response.write("error");
response.close();
setTimeout(function() {
setTimeout(function() {
page.close();
}, 1);
}, 100);
}
});
});
服务处理 java
//得到html
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("skuCode", "123456"));
String html = HttpUtil.sendPost("http://localhost:8888", params);
Document doc = Jsoup.parse(html);
*
* 自己的处理逻辑.....
*
//关闭服务
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("skuCode", "goDie"));
HttpUtil.sendPost("http://localhost:8888", params);
使用jsoup解析Document
得到自己想要的数据。
总结
使用phantomjs可以像解析静态html一样得到ajax返回的数据。单台效率满,可以多台服务器做个集群。