Fil*_*vic 3 javascript node.js web-scraping phantomjs
我在NodeJS中遇到网页报废问题,我想从远程网页上获取一些数据,但数据是从javascript插入到html中的.我开始使用PhantomJS,除了阻止我完成工作的一件事之外它很有效.PhantomJS工作太慢,这段代码需要大约14秒才能执行!?
var page = require('webpage').create();
page.open('https://www.halooglasi.com/nekretnine/izdavanje-stanova/novi-beograd---novi-merkator-id19270/5425485514649', function () {
phantom.exit();
});
Run Code Online (Sandbox Code Playgroud)
请求库只是返回原始数据的速度要快得多,稍微超过一秒钟,因此phantomJS再工作13秒左右.看起来像PhantomJS做了很多不需要的操作,我不需要,我不需要渲染图片视频或任何我只需要javascript执行所以我可以使用cheerio从html获取数据.你能告诉我如何加速PhantomJS或者使用其他更快的webkit来满足我的需求吗?
您可以采取多种措施来缩短处理时间.
1.获得更强大的服务器/计算机(正如Mathieu正确指出的那样).
是的,你可能会认为这与这个问题无关,但是在非常重要的问题上.在没有优化的预算8美元VPS的情况下,您的初始脚本9589ms已经运行,已经提高了约30%.
2.关闭图像加载.它会有所帮助...... 8160ms加载时间.
page.settings.loadImages = false;
Run Code Online (Sandbox Code Playgroud)
3.分析页面,查找和取消不必要的网络请求.
即使在像谷歌浏览器这样的普通浏览器中,该网站也会缓慢加载:使用AdblockPlus的加载时间为129次/ 8.79次.有很多请求(gif,1Mb),如果它们适用于第三方网站,例如facebook,twitter(用于获取小部件)和广告网站.
我们也可以取消它们:
block_urls = ['gstatic.com', 'adocean.pl', 'gemius.pl', 'twitter.com', 'facebook.net', 'facebook.com', 'planplus.rs'];
page.onResourceRequested = function(requestData, request){
for(url in block_urls) {
if(requestData.url.indexOf(block_urls[url]) !== -1) {
request.abort();
console.log(requestData.url + " aborted");
return;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我现在的加载时间就是4393ms页面加载和使用时:PhantomJS截图
如果不修改页面代码,我认为不能做更多的工作,因为根据页面源来判断它是非常糟糕的.
整个代码:
var page = require('webpage').create();
var fs = require("fs");
// console.time polyfill from https://github.com/callmehiphop/console-time
;(function( console ) {
var timers;
if ( !console ) {
return;
}
timers = {};
console.time = function( name ) {
if ( name ) {
timers[ name ] = Date.now();
}
};
console.timeEnd = function( name ) {
if ( timers[ name ] ) {
console.log( name + ': ' + (Date.now() - timers[ name ]) + 'ms' );
delete timers[ name ];
}
};
}( window.console ));
console.time("open");
page.settings.loadImages = false;
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36';
page.viewportSize = {
width: 1280,
height: 800
};
block_urls = ['gstatic.com', 'adocean.pl', 'gemius.pl', 'twitter.com', 'facebook.net', 'facebook.com', 'planplus.rs'];
page.onResourceRequested = function(requestData, request){
for(url in block_urls) {
if(requestData.url.indexOf(block_urls[url]) !== -1) {
request.abort();
console.log(requestData.url + " aborted");
return;
}
}
}
page.open('https://www.halooglasi.com/nekretnine/izdavanje-stanova/novi-beograd---novi-merkator-id19270/5425485514649', function () {
fs.write("longload.html", page.content, 'w');
console.timeEnd("open");
setTimeout(function(){
page.render('longload.png');
phantom.exit();
}, 3000);
});
Run Code Online (Sandbox Code Playgroud)