2017-06-30 6 views
0

私は多くのWebスクレイピングのチュートリアルを見ましたが、私はサブページでウェブをスクラップしまうパターンを見つけることができません。ここでサブページを並行してWebをスクラップする方法は?

はシーケンス

  1. スクラップは、それぞれのURLにいくつかのURL
  2. ゴーを見つけるのURLの別の層にいくつかのURL
  3. Go]を見つけ、テーブル
  4. からコンテンツを読み込むための最初のページです

私は、ステップ1を行うにはしかし、さらに下に、私はすべての良い例を見つけることができない方法を教示多くのURLを見つけることができます。さらに、私はX線を試みましたが、URLが親項目の一部であるためうまくいきません。

var request = require('request'); 
var cheerio = require('cheerio'); 

var url = 'https://news.ycombinator.com'; 

request(url, function (error, response, html) { 
    if (!error && response.statusCode == 200) { 
     var $ = cheerio.load(html); 
     $('span.comhead').each(function(i, element){ 
      // Obtain the URL of the news 
      var a = $(this).prev(); 
      var subUrl = a.attr('href'); 

      // Go to that news and obtain the title 
      request(subUrl, function (error, response, html) { 
       if (!error && response.statusCode == 200) { 
        var $ = cheerio.load(html); 
        var title = $("title").text(); 
        console.log(title); 
       } 
      }); 
     }); 
    } 
}); 

しかし、シーケンシャルな方法で実行されている必要がありeachチーリオス:ここ

は、いくつかのサンプルコードです。ページを並行してスクラップする方法はありますか?

助けてくれてありがとう

+0

これは私には再帰関数のように見えます。 URLをスタックにプッシュし、スタックが空になるまで 'while'ループでそれらを消費することで、それをエミュレートできます。 –

+0

@LaurIvan質問を更新していただき、ありがとうございます。この変更が私が直面している問題を理解するのに役立つことを願っています。ありがとう。 – Winston

答えて

0

これは簡単にX線で行うことができます。例えばコード以下を参照してください。

var Xray = require('x-ray'); 
var x = Xray(); 
var baseUrl = 'https://news.ycombinator.com'; // set base url 
x(baseUrl, { // scrape base url 
    title1: x('a', [{links1:'@href'}]) // store links in array 
})(function(err, obj1) { // pass array to next fx 
    obj1.forEach(function(links.link) { 
     // assuming links.link stores '/sample-link-to-crawl-83792', 
     x(baseUrl+links.link, { // append base url to link and crawl 
      title2: x('a', [{links2:'@href'}]) 
     })(function(err, obj2){ 
      obj2.forEach(function(links2.link) { // for each link in obj2 
       console.log(link) // should print link to console 
      }); 
     }); 
    }); 
}); 

あなたはこのように継続するか、単に約束を返す関数を作成して、いつでもそれをスキャンしたURLのを渡すことができます。その後、完了した約束を見て、返されたデータで必要なことを行います。

関連する問題