2015-02-26 17 views
12

Sto provando a racimolare un website ma non ottengo alcuno degli elementi, perché questi elementi sono creati dinamicamente.Come posso raschiare le pagine con contenuto dinamico usando node.js?

Io uso il cheerio in node.js e il mio codice è di sotto.

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

Questo codice restituisce risposta vuota, perché quando la pagina viene caricata, il <ul id="store_list" class="listMain"> è vuoto.

Il contenuto non è stato ancora aggiunto.

Come posso ottenere questi elementi utilizzando node.js? Come posso raschiare le pagine con contenuti dinamici?

+0

usa phantom.js un browser headless, caricherà e renderizzerà la pagina. puoi accedere a diversi elementi sulla pagina usando la sua API javascript. – Safi

+0

Grazie Safi! Ma potresti darmi uno snippet di codice o qualche riferimento a questo caso? – JayD

risposta

15

Qui vai;

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

Aggiornato il codice per farlo funzionare con node.js – Safi

+0

Grazie! Proverò a eseguire questo codice e aggiungerò feedback per altri utenti !!. :) – JayD

+0

Funziona benissimo !! Grazie mille. Ma ho un'altra domanda. Questa pagina aggiunge il bambino usando lo scroll down. Quindi devo sapere quando sarà attaccata la fine di quel gruppo. Può essere sopra il codice dichiarare callback (function() {ph.exit()} ma il fantasma non è terminato e mantenere il cursore !! – JayD

11

utilizzare il nuovo modulo di NPM x-ray, con un driver web pluggable x-ray-phantom.

esempi nelle pagine di cui sopra, ma ecco come fare scraping dinamica:

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

Stai facendo funzionare questo programma come 'nodo google_xray_code.js 'o come' phantomjs google_xray_code.js' ?? Nella sua forma attuale, phantomjs non è un modulo nodo .. – zipzit

+0

@zipzit phantom non è un modulo nodo, è un driver che si installa esternamente ed esporta il percorso di se si desidera usalo con i raggi X. – Keng

+0

cosa rende questa dinamica? il titolo della pagina di google.com è statico no? – 1mike12

3

Partenza GoogleChrome/puppeteer

senza testa Cromo Nodo API

Rende raschiando piuttosto banale. Il seguente esempio raschiare il titolo sopra a npmjs.com (supponendo .npm-expansions resti)

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 consentirà l'ispezione del elemento dinamico in quanto ciò eseguire gli script nella pagina.

+0

Buona scelta, contabilità, questo [annuncio] (https://groups.google.com/forum/m/# ! argomento/phantomjs/9a I5d-LDuNE) – slesh