在CasperJS

时间:2016-02-05 16:47:03

标签: javascript node.js express phantomjs casperjs

我已经构建了一个简单的网络抓取工具,可以抓取网站并输出我访问此网址时所需的数据 - localhost:3434/page。我使用快速app.get()方法实现了此功能。

我有以下问题,

1)我想知道是否有办法在CasperJS中实现此功能。

2)访问网址后,有没有办法让这段代码开始抓取 - localhost:8081/scrape。我认为我没有正确创建端点,因为它在我访问URL之前开始刮擦

3)当我访问该网址时,它会向我显示错误消息,指出该网址不可用。

我认为如果我可以在CasperJS中将端点正确设置为localhost:3434/page,那么所有这些问题都将得到解决。我不需要在页面上显示结果。当我访问该URL时,我只需要它开始抓取。

以下是我开发的用于在Casper中抓取网站并创建服务器的代码。

var server = require('webserver').create();

var service = server.listen(3434, function(request, response) {
    var casper = require('casper').create({
    logLevel:"verbose",
    debug:true
    });

    var links;
    var name;
    var paragraph;
    var firstName;
    var expression = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi;
    var regex = new RegExp(expression);

    casper.start('http://www.home.com/professionals/c/oho,-TN');

    casper.then(function getLinks(){
         links = this.evaluate(function(){
            var links = document.getElementsByClassName('pro-title');
            links = Array.prototype.map.call(links,function(link){
                return link.getAttribute('href');
            });
            return links;
        });
    });

    casper.then(function(){
        this.each(links,function(self,link){
          if (link.match(regex)) {
            self.thenOpen(link,function(a){
              var firstName = this.fetchText('div.info-list-text');
              this.echo(firstName);
            });
          }
        });
    });

    casper.run(function() {
            response.statusCode = 200;
            response.write(firstName);
            response.close();              
         });
    });

1 个答案:

答案 0 :(得分:2)

您在CasperJS脚本中使用的webserver是PhantomJS的Web Server Module,其“旨在方便PhantomJS脚本与外界之间的通信,建议用作通用生产服务器“

您不应该在PhantomJS中构建您的Web服务器。检查这些节点 - 幻像桥,这些桥将允许您从常规NodeJS Web服务器使用Phantom:

SpookyJS是CasperJS的驱动程序,而其他仅适用于PhantomJS。

虽然CasperJS allows being loaded from within PhantomJS所以你至少可以在Phridge中使用它(不确定其他人),因为它有一个.run函数,它直接在PhantomJS环境中运行任何函数:

casperPath = path.join(require.resolve('casperjs/bin/bootstrap'), '/../..');
phantom.run(casperPath, function(casperPath) {
    phantom.casperPath = casperPath;
    phantom.injectJs(casperPath + '/bin/bootstrap.js');
    casper = require('casper').create();
    ...

除了那些使用PhantomJS的人之外,还有其他人:

ZombieJS使用本机NodeJS库,这使得它在NodeJS应用程序中使用最快,最自然。虽然这意味着更多用于测试目的,但可能无法在其他刮板可能的所有站点上运行。