scraping nodejs node con javascript node.js web-crawler phantomjs cheerio

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(); })