使用cheerio收集数据

时间:2019-04-01 15:47:07

标签: node.js web-scraping

我正在尝试从聊天中抓取数据,但是我不知道如何在NodeJs中使用Cheerio做到这一点

我需要获取消息列表的所有昵称(msg-nickname):

enter image description here

到目前为止,我有:

server.js

var express = require('express');
var fs = require('fs');
var request = require('request');
var cheerio = require('cheerio');
var app     = express();

app.get('/scrape', function(req, res){

url = 'https://www.nimo.tv/live/6865137196';

request(url, function(error, response, html){
    if(!error){
        var $ = cheerio.load(html);

    var nickname, msg;
    var json = { nickname : "", msg : ""};
    const messages = [];

    $('.msg-nickname',).each(function(i, elem){
        console.log(elem);
        messages[i] = elem.parent.children.text();
    })

    console.log($('#chat-room__list').children('msg-wrap').text)


}

app.listen('8081') 
console.log('Magic happens on port 8081'); 
exports = module.exports = app;

每当列表中有新项目时,我还需要更新检查列表并更新列表。

有帮助吗?我有点迷茫,在此先感谢。

1 个答案:

答案 0 :(得分:2)

问题在于,代码.msg-nickname的一部分是在客户端生成的。因此,如果要抓取它,则需要知道数据来自哪个请求,然后执行该请求。

cheerio 只能解析请求响应中的内容。

另一种替代方法是使用puppeteer,它可以让您等待页面完全加载,包括服务器端渲染,ajax请求...

const puppeteer = require('puppeteer');

(async() => {
        const browser = await puppeteer.launch();

        const page = await browser.newPage();

        await page.goto(url);

        // waitForSelector can be added, depending on your needs
        // but if there isn't any user, it will wait until it timesout
        // which may not be desired
        // await page.waitForSelector('.msg-nickname');

        const messages = await page.evaluate(() => {
                return Array.from(document.querySelectorAll('.msg-nickname'))
                        .map(item => item.innerText);
        });

        console.log(messages);
})();

根据昵称的加载方式,您可能需要插入page.on('response')或更改脚本的逻辑,但我将其留给您。