2016-09-12 12 views
0

私のクローラで戦略パターンを実装しようとしているので、異なるWebサイトをクロールするためのさまざまな戦略を使用するのがうまくいくと思います。だから私はpage.evaluateの中の何が現在実行中のウェブサイトによって異なるかを知りたい。 page.evaluate内のコメント付きコードは機能しますが、これを関数に取り出す方法はありますか?私はthis.findJobs()を成功させようとしました。phantomjsの戦略パターンを使用する

"use strict"; 

var Crawler = function() { 
    this.page = require('webpage').create(); 
    this.website = ""; 
    this.jobs_list = []; 

}; 

Crawler.prototype.setStrategy = function(company) { 
    this.website = company; 
}; 

Crawler.prototype.findJobData = function() { 
    return this.website.findJobData(); 
}; 

Crawler.prototype.collectJobData = function() { 
    var page = require('webpage').create(); 
    page.onConsoleMessage = function(msg) { console.log(msg) }; 

    page.open('URL', function (status) { 
     page.includeJs("https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js", function() { 
      var temp_jobs = page.evaluate(this.findJobs()); 

       /* 
       var jobs = []; 
       var job; 
        $('ul.job-list').each(function(){ 
        $(this).find('li').each(function(){ 
         var job_link = $(this).find('a'); 
         var url = "URL" + job_link.attr("href"); 
         var location = $(this).find('span').text(); 

         job = {title: job_link.text(), url: url, location: location, description: ""} 
         jobs.push(job); 
         console.log(job.title, job.url, job.location); 
        }) 
       }); 
       return jobs;*/ 
      console.log(temp_jobs[0].title) 

      phantom.exit(0); 
     }); 
    }); 

}; 

var strategy_a = function() { 

    this.findJobs = function() { 
      var jobs = []; 
      var job; 
      $('ul.job-list').each(function(){ 
       $(this).find('li').each(function(){ 
        var job_link = $(this).find('a'); 
        var url = "URL" + job_link.attr("href"); 
        var location = $(this).find('span').text(); 

        job = {title : job_link.text(), url : url, location : location, description : ""}; 
        jobs.push(job); 
        console.log(job.title, job.url, job.location); 
       }) 
      }); 
      return jobs; 
    }; 
}; 


var strategy_a = new strategy_a(); 
var crawler = new Crawler(); 

crawler.setStrategy(strategy_a); 
crawler.collectJobData(); 

答えて

1

は、次の2つの問題があります。

  • あなたはpage.includeJsコールバックの内側に

  • thispage.evaluate(this.findJobs);の代わりに、page.evaluate(this.findJobs());

    を使用することを意図しCrawlerインスタンスへの参照ではありません。

これは動作するはずです:あなたがそれらのすべてを使用せずに複数のページを生成してきたので、私は二require('webpage').create()を削除

Crawler.prototype.collectJobData = function() { 
    var page = this.page; 
    var self = this; 
    page.onConsoleMessage = function(msg) { console.log(msg) }; 

    page.open('URL', function (status) { 
     page.includeJs("https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js", function() { 
      var temp_jobs = page.evaluate(self.website.findJobs); 
      console.log(temp_jobs[0].title) 

      phantom.exit(0); 
     }); 
    }); 
}; 

注意を。

+0

私はあなたのコードを実行したときに、私は次のエラーを取得する:/例外TypeError:2 :3 – Pierre

+1

あなた 'Crawler.prototype.findJobData'機能未定義は未定義( 'this.website.findJobs' を評価)オブジェクト ではありません特定の 'findJobs'関数がページコンテキストで直接動作するように設定されなければならないので、無駄です。 'findJobData'を使うと' findJobs'のためのプロキシーを行うことはできません。なぜなら、 'page.evaluate'はサンドボックス化されており、ページコンテキスト外の参照を許さないからです。とにかく、私は答えを決めました。 –

+0

説明をありがとう。 – Pierre

関連する問題