2016-08-20 2 views
0

Im создает образец скребка для тестирования, чтобы узнать о Cheerio и jQuery.Cheerio Node.JS External Title link issue

Я почесываю голову по второму запросу после того, как получил группу 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 но точки ошибок в функция обратного вызова во втором запросе.

Любые советы о том, как я мог это исправить?

+0

Обратите внимание, что многие из ваших переменных являются глобальными, поскольку вы использовали точки с запятой вместо запятой после определения второй переменной. – adeneo

ответ

1

Один из возвратившихся выглядит в URL, как этот

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

Там могут быть и другие, но глядя на 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 плохим шлюзом», и теперь вам нужно справиться с этим и, возможно, многими другими вещами, так как нет никакой гарантии, что все дрянные ссылки, размещенные на Reddit, действительно работают.