使用 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 €</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 €' ]
我正在尝试抓取一个网页以尝试使用 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 €</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 €' ]