2016-08-20 3 views
0

CheerioとjQueryについて学ぶサンプルテストスクレーパーをビルドしました。Cheerio Node.JS外部タイトルリンクの問題

URLのグループを受け取って保存した後で、そのURLをロードしてそのページのヘッダーからタイトルを取得するという別の要求を行った後で、二次要求で頭が痛いです。

私のコードは次のようになっています。

var request = require('request'), 
    cheerio = require('cheerio'); 
    urls = []; 
    titles = []; 
request('http://reddit.com', function(err, resp, body){ 
if(!err && resp.statusCode == 200){ 
var $ = cheerio.load(body); 

    $('a.title', '#siteTable').each(function(){ 
    var url = $(this).attr('href'); 
    urls.push(url); 
}); 
    //issue is here 
    for(var i = 0; i < urls.length; i++){ 
    request(urls[i], function(err, resp, body){ 
    var $ = cheerio.load(body); 

    var title = $("title").text(); 

    console.log(title); 
    }); 
    } 
    } 
}); 

ページからタイトルを付けるとどこかに不確定なプロパティが表示されるようです。

私はjQueryの新機能だと言わなければならないので、このコードはおそらくばかげているようです(私は仮定しています)。

私はコンソールからの受信エラーは、

TypeError: Cannot read property 'parent' of undefined 
    at Function.exports.update (/home/pi/node_modules/cheerio/lib/parse.js:55:25) 
    at module.exports (/home/pi/node_modules/cheerio/lib/parse.js:17:11) 
    at Function.exports.load (/home/pi/node_modules/cheerio/lib/static.js:19:14) 
    at Request._callback (/home/pi/scraper.js:16:22) 
    at self.callback (/home/pi/node_modules/request/request.js:187:22) 
    at Request.emit (events.js:95:17) 
    at Request.init (/home/pi/node_modules/request/request.js:275:17) 
    at new Request (/home/pi/node_modules/request/request.js:129:8) 
    at request (/home/pi/node_modules/request/index.js:55:10) 
    at Request._callback (/home/pi/scraper.js:15:6) 

である私は、このエラーは、私は、変数未定義を持っていると私は.somethingをのような二次的属性だけに、エラー箇所を作るしようとしていることを意味していることを理解しますコールバック関数は2番目の必須です。

私はこれをどのように修正できるかに関するアドバイスはありますか?

+0

2番目の変数定義の後にカンマの代わりにセミコロンを使用したので、多くの変数がグローバルであることに注意してください。 – adeneo

答えて

1

この

/r/Jokes/comments/4yp0ex/mom_dont_freak_out_but_im_in_the_hospital/ 

のようなURLの返されたルックスの一つは、他の人があるかもしれませんが、これにしよう、のredditを見て一つはアンカーをはっきりと見ることができる、そしてもちろんのhref

<a class="title may-blank " href="/r/Jokes/comments/4yp0ex/mom_dont_freak_out_but_im_in_the_hospital/" tabindex="1" rel="">"Mom? Don't freak out, but I'm in the hospital..."</a> 

要求を使用してプロトコルやドメインのないURLを取得し、失敗し、すべてがクラッシュします。

あなたは、それを行うための簡単な方法は、あなたがいくつかのURLの後にそれを参照してくださいよ、という実行

for (var i = 0; i < urls.length; i++) { 
    var uri = (/^(f|ht)tps?:\/\//i.test(urls[i]) ? "" : "https://www.reddit.com") + urls[i]; 

    request(uri, function(err, resp, body) { 
    if (err) { 
     // handle errors 
    } else { 
     var $ = cheerio.load(body); 
     var title = $("title").text(); 

     console.log(title); 
    } 
    }); 
} 

ようになり、ドメインを追加し、絶対URLのを作成することで、内部リンクを処理する必要が"502 Bad gateway"に遭遇しました.Redditに投稿されたすべての泥棒リンクが実際に動作するという保証はありません。