javascript - nodejs - web scraping cheerio node js
¿Cómo puedo raspar páginas con contenido dinámico usando node.js? (4)
Estoy tratando de raspar un website pero no obtengo algunos de los elementos, porque estos elementos se crean dinámicamente.
Uso el cheerio en node.js y mi código está debajo.
var request = require(''request'');
var cheerio = require(''cheerio'');
var url = "http://www.bdtong.co.kr/index.php?c_category=C02";
request(url, function (err, res, html) {
var $ = cheerio.load(html);
$(''.listMain > li'').each(function () {
console.log($(this).find(''a'').attr(''href''));
});
});
Este código devuelve una respuesta vacía, porque cuando se carga la página, el
<ul id="store_list" class="listMain">
está vacío.
El contenido aún no se ha agregado.
¿Cómo puedo obtener estos elementos usando node.js? ¿Cómo puedo raspar páginas con contenido dinámico?
Aqui tienes;
var phantom = require(''phantom'');
phantom.create(function (ph) {
ph.createPage(function (page) {
var url = "http://www.bdtong.co.kr/index.php?c_category=C02";
page.open(url, function() {
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
page.evaluate(function() {
$(''.listMain > li'').each(function () {
console.log($(this).find(''a'').attr(''href''));
});
}, function(){
ph.exit()
});
});
});
});
});
Echa un vistazo a GoogleChrome/puppeteer
API de nodo de Chrome sin cabeza
Hace que el raspado sea bastante trivial.
El siguiente ejemplo
raspará
el titular en
npmjs.com
(asumiendo que
.npm-expansions
permanece)
const puppeteer = require(''puppeteer'');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(''https://www.npmjs.com/'');
const textContent = await page.evaluate(() => {
return document.querySelector(''.npm-expansions'').textContent
});
console.log(textContent); /* No Problem Mate */
browser.close();
})();
evaluate
permitirá la inspección del elemento dinámico ya que esto ejecutará scripts en la página.
La solución más fácil y confiable es usar titiriteros. Como se menciona en https://pusher.com/tutorials/web-scraper-node, que es adecuado tanto para el desguace estático + dinámico .
Solo cambie el tiempo de espera en Browser.js, TimeoutSettings.js, Launcher.js 300000 a 3000000
Utilice el nuevo módulo de x-ray npm, con un controlador web conectable x-ray-phantom .
Ejemplos en las páginas anteriores, pero aquí se explica cómo hacer un raspado dinámico:
var phantom = require(''x-ray-phantom'');
var Xray = require(''x-ray'');
var x = Xray()
.driver(phantom());
x(''http://google.com'', ''title'')(function(err, str) {
if (err) return done(err);
assert.equal(''Google'', str);
done();
})