2015-02-26 23 views
12

website kazımaya çalışıyorum ancak bazı öğelerden anlamıyorum, çünkü bu öğeler dinamik olarak oluşturulur.node.js kullanarak sayfaları dinamik içeriklerle nasıl tarayabilirim?

node.js içinde cheerio kullanıyorum ve kodum aşağıda. Sayfa yüklendiğinde, <ul id="store_list" class="listMain"> boş olduğu için

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

Bu kod, boş bir yanıt verir.

İçerik henüz eklenmemiş.

Bu öğeleri node.js kullanarak nasıl edinebilirim? Sayfaları dinamik içeriklerle nasıl tarayabilirim?

+0

phantom.js'yi başsız bir tarayıcı kullanarak sayfayı yükler ve oluşturur. javascript API'sini kullanarak sayfadaki farklı öğelere erişebilirsiniz. – Safi

+0

Teşekkürler Safi! Ama bana bir kod pasajı veya bu dava ile ilgili bir referans verebilir misiniz? – JayD

cevap

15

İşte siz gidin;

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

Node.js – Safi

+0

ile çalışmasını sağlamak için kodu güncellendi Teşekkürler! Bu kodu çalıştırmaya çalışacağım ve başka kullanıcılar için geri bildirim ekleyeceğim !! :) – JayD

+0

Bu iyi çalışıyor! Çok teşekkür ederim. Ama başka bir sorum var. Bu sayfa aşağı kaydırmayı kullanarak çocuğu ekler. Yani o grubun bitişinin ne zaman ekleneceğini bilmek zorundayım. Kod bildirimi geri bildirimi (function() {ph.exit()} üzerinde olabilir ancak phantom sonlandırılmamış ve imleci koruyacaktır! – JayD

11

takılabilir bir web sürücüsü x-ray-phantom ile, yeni npm modülünü x-ray kullanın. Burada

yukarıdaki sayfalarda örnekleri ancak dinamik kazıma yapmak için:

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

Bu programı 'node google_xray_code.js olarak çalıştırıyor musunuz? ya da phantomjs google_xray_code.js' olarak mı? Mevcut haliyle, phantomjs bir düğüm modülü değildir .. – zipzit

+0

@zipzit phantom bir düğüm modülü değil, dışsal olarak yüklediğiniz ve isterseniz yol dışa aktardığınız bir sürücüdür x-ray ile kullanın – Keng

+0

bu dinamik kılan nedir? google.com'un başlık sayfası sabittir – 1mike12

3

Kontrol dışarı GoogleChrome/puppeteer

Başsız Krom Düğüm API

Oldukça önemsiz kazıma yapar. Aşağıdaki örnek bu sayfadaki komut dosyalarını çalışacak gibi dinamik elemanın kontrolü için izin verecektir

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 (.npm-expansions kalıntıları varsayarak) npmjs.com de başlık üzerinde kazımak olacak.

+0

İyi seçim, muhasebe, bu [duyuru] (https://groups.google.com/forum/m/# ! konu/phantomjs/9a I5d-LDuNE) – slesh