我正在尝试从聊天中删除数据,但我不知道如何在NodeJs中使用Cheerio
我需要获取消息列表的所有昵称(msg-nickname):
到目前为止,我有:
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-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')
,或者更改脚本的逻辑,但我留给您。