web-dev-qa-db-fra.com

Comment puis-je gratter des pages avec du contenu dynamique en utilisant node.js?

J'essaie de gratter un site Web mais je ne reçois pas certains des éléments, car ces éléments sont créés dynamiquement.

J'utilise le cheerio dans node.js et mon code est ci-dessous.

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

Ce code renvoie une réponse vide, car lorsque la page est chargée, le <ul id="store_list" class="listMain"> est vide.

Le contenu n'a pas encore été ajouté.

Comment puis-je obtenir ces éléments en utilisant node.js? Comment puis-je gratter des pages avec du contenu dynamique?

21
JayD

Voici;

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

Découvrez GoogleChrome/marionnettiste

Sans tête Chrome Node API

Cela rend le grattage assez trivial. L'exemple suivant effacera le titre sur npmjs.com (en supposant que .npm-expansions reste)

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 permettra l'inspection de l'élément dynamique car cela exécutera des scripts sur la page.

13
scniro

Utilisez le nouveau module npm x-ray , avec un pilote Web enfichable x-ray-phantom .

Exemples dans les pages ci-dessus, mais voici comment effectuer un grattage dynamique:

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