问题描述
我目前正在尝试通过URL将页面源代码写入文本文件。 一切正常,但我想另外注入一个JavaScript文件。 问题在于该文件未正确包含。 仅最后加载的页面,但其他页面不完整。
//phantomjs C:\PhantomJS\Script\test1.js
var fs = require('fs');
var numeroEpisode = 0;
var maxEpisode = 10;
var fichierLien = fs.read('C:\\PhantomJS\\Fichier\\lien.txt');
var ListeLien = fichierLien.split(/[\n]/);
var page = require('webpage').create();
function GetPage()
{
if (numeroEpisode > maxEpisode)
{
phantom.exit();
}
page.open(ListeLien[numeroEpisode], function(status)
{
if(status !== 'success')
{
console.log('Impossible de charger la page.');
}
else
{
console.log('URL: '+ListeLien[numeroEpisode]+'');
page.injectJs('http://mylink.com', function() { });
var path = 'C:\\PhantomJS\\Fichier\\episode_'+numeroEpisode+'.html';
fs.write(path, page.content, 'w');
setTimeout(GetPage, 15000); // run again in 15 seconds
numeroEpisode++;
}
});
}
GetPage();
1楼
不要混淆和 。
injectJs(filename)
:将本地JavaScript文件加载到页面中并对其进行同步评估。
includeJs(url, callback)
:从指定的URL加载一个远程JavaScript文件并对其进行评估。
由于它必须请求远程资源,因此这是异步完成的。
操作完成后,将立即调用传递的回调。
如果您不使用回调,则代码很可能会在包含远程JavaScript之前运行。
使用该回调:
page.includeJs('http://mylink.com', function() {
var path = 'C:\\PhantomJS\\Fichier\\episode_'+numeroEpisode+'.html';
fs.write(path, page.content, 'w');
numeroEpisode++;
setTimeout(GetPage, 15000); // run again in 15 seconds
});
由于您加载的JavaScript更改了页面上的某些内容,因此您可能需要在所有页面脚本运行后再加载它。 如果这是JavaScript繁重的页面,则需要稍等一下。 您可以等待一段固定的时间:
setTimeout(function(){
page.includeJs('http://mylink.com', function() {
//...
});
}, 5000); // 5 seconds
或利用等待直到出现一个表示页面已完全加载的元素。 有时这可能非常棘手。
如果你仍然想使用injectJs()
代替includeJs()
例如,由于其同步性),那么你就需要外部JavaScript文件下载到本机,然后你可以使用injectJs()