如何在NodeJS中使用Cheerio和Axios刮取Youtube评论

eyh26e7m  于 2022-11-03  发布在  Node.js
关注(0)|答案(1)|浏览(125)

这是yt注解

的开发控制台
"我想展示拉图叔叔"
这是我的输出

我试着抓取YouTube的评论部分,但我面临着一个问题,而这样做。
这是我试过的

const express=require('express');
const app=express();
const cheerio=require('cheerio');
const axios=require('axios');

const url='https://www.youtube.com/watch?v=d2Dw-PuNZSE';

axios(url).then(response=>{
    const html=response.data;
    // console.log(html);
    const $=cheerio.load(html);
    const ytdata=[];
    $('.ytd-comment-renderer',html).each(function(){
        const author=$(this).find('div#header-author h3 a').text();
        ytdata.push({
            author
        })
    })
    console.log(ytdata);
}).catch(err=>console.log("This is an error"+err))
app.listen(8080,()=>{
    console.log("Listening on port 8080");
})

"我想展示拉图叔叔"

jjjwad0x

jjjwad0x1#

你的代码的问题是你的html缺少div#header-author。这是因为Youtube动态加载数据,所以你不能轻松地擦除它。我的建议是要么使用puppeteer(但Youtube可能会很快找到你的机器人并阻止你),要么使用自定义的擦除器。
例如,作为Web Scraping API的一名工程师,您可以通过以下方式将我们的解决方案集成到您的脚本中,并获得所需的结果:

const express=require('express');
const cheerio=require('cheerio');
const axios=require('axios');

const API_KEY='<YOUR_API_KEY>'
const YOUTUBE='https://www.youtube.com/watch?v=d2Dw-PuNZSE';

const url = `https://api.webscrapingapi.com/v1?api_key=${API_KEY}&url=${YOUTUBE}&render_js=1&wait_for=10000&timeout=30000&js_instructions=%5B%7B%22action%22%3A%22scrollTo%22%2C%22selector%22%3A%22div%23title%22%2C%22timeout%22%3A5000%2C%22block%22%3A%22start%22%7D%5D`

axios(url).then(response=>{
    const html=response.data
    const $=cheerio.load(html);
    const ytdata=[];
    $('.ytd-comment-renderer',html).each(function(){
        const author=$(this).find('div#header-author h3 a').text();
        ytdata.push({
            author
        })
    })
    console.log(ytdata);
}).catch(err=>console.log("This is an error"+err))

使用第三方scraper的好处是它提供了IP轮换、各种代理类型等功能,使Youtube更难检测到bot。或者,您可以在您的项目中使用puppeteer,如下所示:

const puppeteer = require("puppeteer")
const cheerio=require('cheerio');

const main = async () => {
    const browser = await puppeteer.launch({
        headless: false,
        defaultViewport: null,
        acceptInsecureCerts: true,
    })
    const page = await browser.newPage()
    await page.goto('https://www.youtube.com/watch?v=d2Dw-PuNZSE')
    await page.waitForSelector("#header-author", {
        timeout: 10000
    })
    const html = await page.content();
    await browser.close()
    const $=cheerio.load(html);
    const ytdata=[];
    $('.ytd-comment-renderer',html).each(function(){
        const author=$(this).find('div#header-author h3 a').text();
        ytdata.push({
            author
        })
    })
    console.log(ytdata);
}

main()

相关问题