使用 cheerio node JS 进行网页抓取

Webscraping with cheerio nodeJS

我正在尝试抓取一个网页以尝试使用 cheerio 的一些技巧,但我做不到。我正在使用 axios 来制作 http request.

scrape.js

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

async function iniciar() {
    axios.get('https://www.idealo.es/precios/4102124/the-north-face-men-s-mcmurdo-parka-tnf-black.html').then( res => {
        var price = [];
        const $ = cheerio.load(res.data);

        $('span.oopStage-variantThumbnailsFromPrice').each( (index, element) => {
            const name = $(element).first().text()
            price.push(name)
        })
        console.log(price);
    })
}

module.exports = {
    iniciar
};

main.js

const scrape = require('./assets/scrape');
scrape.iniciar()

它总是返回一个空值。

<strong>
 <span class="oopStage-variantThumbnailsFromText">desde</span>
 <span class="oopStage-variantThumbnailsFromPrice">294,99&nbsp;€</span>
</strong>

任何想法。

这对您不起作用的原因是您所需页面生成的 html 是动态的,它是在客户端通过 JavaScript 代码生成的。

我们仍然可以抓取数据,但我们必须使用类似 Puppeteer 的东西(Zombie.js 或其他无头浏览器也可能工作。)不过我将在这个例子中使用 Puppeteer。

我们加载您想要的页面,然后以与之前几乎相同的方式解析 html。

我还使用 user-agents 生成随机用户代理以避免验证码请求。

const puppeteer = require('puppeteer');
const cheerio = require('cheerio');
const userAgent = require('user-agents');

async function getDynamicPageHtml(url) {
    try {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.setUserAgent(userAgent.toString());

        await page.goto(url, { waitUntil: 'networkidle0' });
        const html = await page.evaluate(() => document.querySelector('*').outerHTML);

        await browser.close();
        return html;
    } catch (err) {
        console.error(err);
        return null;
    }
}

async function iniciar() {
    const html = await getDynamicPageHtml('https://www.idealo.es/precios/4102124/the-north-face-men-s-mcmurdo-parka-tnf-black.html');
    const $ = cheerio.load(html);
    const price = $('span.oopStage-variantThumbnailsFromPrice').map( (index, element) => {
        return $(element).first().text().trim();
    }).toArray();
    console.log("iniciar: price:", price);
    return price;  
}

module.exports = {
    iniciar
};

我在调用 iniciar 时得到以下输出:

iniciar: price: [ '294,99 €' ]