2016-04-03 1 views
2

Google検索ページにあらかじめ設定された検索語句(「Apples」)を読み込んでいます。次に、検索ボックスに入力して別のものを探したいのですが、期待通りに動作しません(コードの下の詳細な説明)。CasperJSは、Google検索をスクラップするときに、特定のユーザーエージェント文字列を設定変更すると異なる結果を返します。

var links = []; 
var casper = require('casper').create({ 
    // verbose: true, 
    // logLevel: "debug" 
    // pageSettings: { 
    // userAgent: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5' 
    // } 
}); 

function getLinks() { 
    var links = document.querySelectorAll('h3.r a'); 
    return Array.prototype.map.call(links, function(e) { 
     return e.innerText; 
    }); 
} 

casper.start('https://www.google.com/#safe=off&q=Apples', function() { 
    // search for 'casperjs' from google form 
    this.fill('form[action="/search"]', { q: 'casperjs' }, true); 
    casper.capture('screenshot/googleresults1.png'); 

}); 

casper.then(function() { 
    // aggregate results for the 'casperjs' search 
    links = this.evaluate(getLinks); 
    casper.capture('screenshot/googleresults2.png'); 
    // now search for 'phantomjs' by filling the form again 
    this.fill('form[action="/search"]', { q: 'phantomjs' }, true); 

}); 

casper.then(function() { 
    // aggregate results for the 'phantomjs' search 
    links = links.concat(this.evaluate(getLinks)); 
}); 

casper.run(function() { 
    // echo results in some pretty fashion 
    this.echo(links.length + ' links found:'); 
    casper.capture('screenshot/googleresults3.png'); 
    this.echo(' - ' + links.join('\n - ')).exit(); 
}); 

私が経験したバグ:

  • を.createでユーザーエージェント(含む)は私のコンソールには結果を与えません。

    1. ユーザーエージェントをコメントアウトが、冗長とログレベルを含め、私の「りんご」を与え、すべてをコメントアウト
    2. の結果を私に右の結果(CasperjsとPhantomjs)

私の質問を与えます私は、verboseとLogLevelの両方をオンにすると、casper.start関数のように "Apples"の結果が得られるのか理解できません。

  • ユーザエージェントをオンにすると、結果が0になるのはなぜですか?
  • 他に誰かがいるのですか?ご覧のとおり、適切な結果は、検索ボックスに入力された両方の塗りつぶし機能によって、CasperjsとPhantomjsになります。

    私の3つのキャプチャ Screenshot1
    Screenshot2
    Screenshot3

    のスクリーンショットいくつかの場面で、私のコンソールで数回のプログラムを繰り返した後、第一フィルアクションが進まない表示されます。したがって、それはアップルをこすります。しかし、なぜこれが不思議ですか?代わりに別の関数を使用するように変更する必要がありますか?

    答えて

    2

    Googleは、ユーザーエージェント、ビューポートのサイズ、およびその他の指標に応じて、異なるページを配信します。

    異なるページは、PhantomJSで正しく動作しない追加のJavaScriptで表示される可能性があります(クリックして送信することは常に問題です)。異なる構成(ユーザーエージェント、ビューポートサイズ)間で要素が追加、削除、またはIDが変更される可能性もあります。

    スクリーンショット(casper.capture(filename))を取得し、現在のページソース(fs.write(filename, casper.getHTML()))を安全にチェックして、デスクトップブラウザに表示されているものとの違いがあるかどうかを確認する必要があります。

    スクリプト内

    具体的な問題:

    • ページ・ロードが存在しない場合は、あなたが変更されたコンテンツを待つcasper.wait*関数のいずれかを使用する必要があります。 casper.then()は、通常、全ページの読み込みのみを捕捉する非同期ステップ関数です。
      すぐにcasper.fill()が終了しますが、入力された内容が実際に読み込まれるまでには時間がかかる場合があります。したがって、をcasper.fill()の直後に使用しても、意図した結果は得られません。

    • thisは、CasperJS関数の中で常にcasperを参照します。したがって、それらを同じ意味で使用することができます。

    +1

    スクレイピング/自動化を開始するときは、Googleのページから始めないことをおすすめします。 –

    +0

    非常に助けてくれてありがとう。あなたの提案したことをスクリーンショットで更新しました。私のクエリCasperJsの最初の塗りつぶし関数は通過しないようです。したがって、プログラムは "Apple"を擦り傷をつけます。 また、私がuserAgentをインクルードすると、スクリーンショットが表示されてもページ全体が読み込まれません。それに何か問題がありますか?どうもありがとう。 this.getHTML()またはcasper.getHTML()を使用する必要がありますか? – Ming

    +0

    フィードバックをいただきありがとうございます。私はCasperJSについてもう一つ質問があります。 http://stackoverflow.com/questions/36386601/casperjs-not-returning-google-search-link-titles-but-screenshot-source-code-te あなたもそれを見ることができます。ありがとう。 – Ming

    関連する問題