0

RequestCheerioを使用して単純な webscraper を構築しようとしています。

現在の目標は、宛先ページ (この場合はhttp://bukk.it ) をスクレイピングし、ページのターゲット セレクターからテキストを取得して、他の関数で使用できる配列にプッシュすることです。

非同期で実行されていることは理解してrequest()いますが、スクレイピングされたデータを関数の外部に表示する方法がわかりません。

example.js

// dependencies
var request = require('request')
, cheerio = require('cheerio');

// variables
var url = 'http://bukk.it/'; // url to scrape
var bukkits = []; // hold our scraped data

request(url, function(err, resp, body){

  if (err) {
    return
  }

  $ = cheerio.load(body);
  // for each of our targets (within the request body)...
  $('td a').each(function(){
    content = $(this).text();
    // I would love to populate the bukkits array for use later...
    bukkits.push(content);
  })
  console.log(bukkits.length); // everything is working inside request
});

console.log(bukkits.length); // nothing, because request is asynchronous?

// that's cool but... how do I actually get the data from the request into bukkits[] ?
4

2 に答える 2

2

基本的に、プログラム全体をコールバック内で実行する必要があります。そのコールバックの後のコードは、非同期で取得されてコールバックに渡されたデータにアクセスできなくなります。

これは思ったほど悪くはありません。次のように、名前付き関数を使用できます。

request(url, onRequestDone);

function onRequestDone(err, resp, body) {
  var bukkits = []; // not global, make it local

  // as above

  doMoreWork(bukkits);
}

function doMoreWork(bukkits) {
  // stuff after the parsing goes here.
}
于 2013-02-05T23:23:21.800 に答える
0

リクエストが完了する前にコードが終了します。

エージェントの永久バージョンを使用する

request = require('request').forever;

setTimeoutを使用して、プログラムを実行し続けます。

setTimeout(function(){}, 1000000);

後で値を使用するには、要求の呼び出しが完了した後にも実行する必要があります。

于 2013-02-05T23:19:47.527 に答える