首页 > 解决方案 > 如何在 Node.js 中使用 Cheerio 抓取具有变化数据的表?

问题描述

我正在尝试从网站中不断变化的值的表中抓取数据。所以每一行可能每天都在变化,但我希望能够抓取正确的数据。我目前正在使用 Cheerio 库,但我不熟悉它,但这就是我所拥有的:

const rp = require("request-promise");
const cheerio = require("cheerio");

let Italy = "";

async function main() {
    const result = await rp.get("https://www.worldometers.info/coronavirus/");
    const $ = cheerio.load(result);

    $("#main_table_countries > tbody:nth-child(2) > tr:nth-child(2)").each((i,el) => {
        const item = $(el).text();
        Italy = item;
    });
}

因此,正如您所看到的,这从 worldometer 网站上抓取了意大利冠状病毒病例的数据。然而,意大利的立场在过去几天里一直在 2 到 3 之间变化。这导致我的程序获取了错误的信息。这就是我想要解决的问题。

这是worldometer网站的链接: https ://www.worldometers.info/coronavirus/

谢谢, 卡提克

标签: javascriptnode.jsweb-scrapingcheeriorequest-promise

解决方案


我实施的是,您可以获取所有tr's并循环它们以获取所有名称并将其添加到数组中,然后使用数组索引查找您想要的任何国家

async function main() {
    let NamesArr=[]
    let CountryToFind= 'Italy'


    const result = await rp.get("https://www.worldometers.info/coronavirus/");
    const $ = cheerio.load(result);

    $('#main_table_countries').find('tbody').eq(0).find('tr').each((i,el)=>{
        NamesArr.push($(el).find('td').eq(0).text().trim())
    })

    let Index= NamesArr.indexOf(CountryToFind) + 1 

    $(`#main_table_countries > tbody:nth-child(2) > tr:nth-child(${Index})`).each((i,el) => {
        const item = $(el).text();
        console.log(item);
    });
}

main()

这让我回归

CMD 结果图像

您绝对可以重构它,但这种方式使您的解析器动态化,因为您现在可以搜索任何国家/地区。


推荐阅读