2015-02-26 16 views
12

Ich versuche, eine website zu kratzen, aber ich bekomme einige der Elemente nicht, weil diese Elemente dynamisch erstellt werden.Wie kann ich mit node.js Seiten mit dynamischem Inhalt erstellen?

Ich benutze die cheerio in node.js und Mein Code ist unten.

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

Dieser Code gibt leere Antwort, weil, wenn die Seite geladen wird, die <ul id="store_list" class="listMain"> leer ist.

Der Inhalt wurde beigefügten bisher noch nicht.

Wie kann ich diese Elemente mit node.js? Wie kann ich Seiten mit dynamischen Inhalten scrappen?

+0

Verwenden Sie phantom.js einen kopflosen Browser, wird es laden und rendern die Seite. Mit der Javascript-API können Sie auf verschiedene Elemente auf der Seite zugreifen. – Safi

+0

Danke Safi! Aber könnten Sie mir ein Code-Snippet oder eine Referenz mit diesem Fall geben? – JayD

Antwort

15

Hier gehen Sie;

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

Der Code wurde aktualisiert, damit er mit node.js funktioniert – Safi

+0

Vielen Dank! Ich werde versuchen, diesen Code auszuführen, und ich werde Feedback für andere Benutzer hinzufügen. :) – JayD

+0

Das funktioniert gut !! Vielen Dank. Aber ich habe eine andere Frage. Diese Seite hängt das Kind an, indem Sie nach unten scrollen. Ich muss also wissen, wann das Ende dieser Gruppe angehängt werden muss. Kann über code deklarieren callback (function() {ph.exit()} aber phantom ist nicht beendet und behalten cursor !! – JayD

11

Verwenden Sie das neue Modul npm x-ray, mit einem steckbaren Web-Treiber x-ray-phantom.

Beispiele auf den Seiten oben, aber hier ist, wie dynamisch Schaben zu tun:

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

Laufen Sie dieses Programm als 'Knoten google_xray_code.js 'oder' PhantomJS google_xray_code.js' ?? In seiner jetzigen Form PhantomJS kein Knotenmodul ist .. – zipzit

+0

@zipzit Phantom ist kein Knotenmodul, es ist ein Fahrer ist, die Sie extern installieren und den Pfad exportieren, wenn Sie möchten, verwenden sie es mit x-ray. – Keng

+0

was diese Dynamik macht? der Titel der Seite von google.com ist statisch nicht? – 1mike12

3

Check out GoogleChrome/puppeteer

Headless Chrome Node API

Es macht ziemlich trivial Schaben. Im folgende Beispiel wird die Überschrift kratzt an npmjs.com über (.npm-expansions bleibt unter der Annahme)

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 für die Inspektion des dynamischen Elements ermöglichen, da diese Skripte auf der Seite ausgeführt wird.

+0

Gute Wahl, Buchhaltung, diese [Ankündigung] (https://groups.google.com/forum/m/# ! topic/phantomjs/9a I5d-LDuNE) – slesh

Verwandte Themen