Node.js 使用ChereIO刮取数据

Node.js 使用ChereIO刮取数据,node.js,web-scraping,Node.js,Web Scraping,我正试图从聊天中删除数据,但我不知道如何在NodeJs中使用Cheerio 我需要获取邮件列表中的所有昵称(msg昵称): 到目前为止,我已经: server.js var express = require('express'); var fs = require('fs'); var request = require('request'); var cheerio = require('cheerio'); var app = express(); app.get('/scra

我正试图从聊天中删除数据,但我不知道如何在NodeJs中使用Cheerio

我需要获取邮件列表中的所有昵称(msg昵称):

到目前为止,我已经:

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;
我还需要更新,每次列表中有新项目时,都要检查并更新列表


有什么帮助吗?我有点迷路了,提前谢谢。

问题是代码
.msg昵称
的那部分是在客户端生成的。所以,如果您想刮取数据,您需要知道数据来自哪个请求,并执行该请求

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

另一种选择是使用
puppeter
,这将允许您等待页面完全加载,包括服务器端渲染、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')
,或者更改脚本的逻辑,但我将此留给您。

使用这一行如何
wait page.waitFor('.msg昵称')为了确保页面正确加载?问题是,该选择器并不总是存在,如果没有用户连接,它将等待直到超时,从而使脚本速度慢得多。每个刮板都是唯一的,所以有时候你想使用
等待页面。waitForSelector('.msg昵称')
,有时候你不想使用,在这种情况下,不这样做会更好。我在代码中添加了注释,但在这种情况下不需要。你需要每隔一段时间运行它并推送到消息,可能是使用WebSocket而不是像您这样使用http请求。哦,我明白了,谢谢您的回答!为了做到这一点,我将学习更多