Есть сайты, DOM и содержимое которых генерируются динамически при загрузке страницы. (Сайты на основе Angularjs печально известны этим)
Какой подход вы используете? Я пробовал как phantomjs, так и jsdom, но, похоже, я не могу заставить страницу выполнить свой javascript, прежде чем я очищаю.
Вот простой пример jsdom (не основанный на angularjs, но все же динамически сгенерированный)
var env = require('jsdom').env;
exports.scrape = function(link, callback) {
var config = {
url: link,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36'
},
done: jsdomDone
};
env(config);
}
function jsdomDone(err, window) {
var info = null;
if(err) {
console.error(err);
} else {
var $ = require('jquery')(window);
console.log($('.profilePic').attr('src'));
}
}
exports.scrape('https://www.facebook.com/elcompanies');
Я пробовал фантомы с умеренным успехом.
var page = new WebPage()
var fs = require('fs');
page.onLoadFinished = function() {
console.log("page load finished");
window.setTimeout(function() {
page.render('export.png');
fs.write('1.html', page.content, 'w');
phantom.exit();
}, 10000);
};
page.open("https://www.facebook.com/elcompanies", function() {
page.evaluate(function() {
});
});
Здесь я жду события onLoadFinished и даже ставлю 10-секундный таймер. Интересно то, что в то время как мой захват изображения export.png страницы показывает полностью обработанную страницу, мой 1.html не показывает элемент класса .profilePic на его законном месте. Похоже, он находится в каком-то коде javascript, окруженном каким-то блоком "require("TimeSlice").guard(function() {bigPipe.onPageletArrive({...")
Если вы можете предоставить мне рабочий пример, который соскребает изображение с этой страницы, это было бы полезно.