phantomjs的正确打开方式(爬虫)

以下是我学习使用phantomjs爬虫的打怪升级之路,过程充满艰辛,也充满欢乐,但一路的风景就是最大的乐趣,不是么?希望大家能get到想要的东西!

安装phantomjs

  • 自行下载安装 phantomjs官网
  • phantomjs使用案例 案例 看看使用案例

实战爬虫

这里主要用到phantomjs的两个模块,分别是webserverwebpage。用这两个模块开发一个独立的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 params = new ArrayList();
params.add(new BasicNameValuePair("skuCode", "123456"));
String html = HttpUtil.sendPost("http://localhost:8888", params);
Document doc = Jsoup.parse(html);
*
*  自己的处理逻辑.....
*
//关闭服务
List params = new ArrayList();
params.add(new BasicNameValuePair("skuCode", "goDie"));
HttpUtil.sendPost("http://localhost:8888", params);

使用jsoup解析Document得到自己想要的数据。

总结

使用phantomjs可以像解析静态html一样得到ajax返回的数据。单台效率满,可以多台服务器做个集群。

你可能感兴趣的:(phantomjs的正确打开方式(爬虫))