我目前正在尝试通过网址将页面源代码写入文本文件。一切都运作良好,但我想另外注入一个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();
答案 0 :(得分:0)
不要混淆page.injectJs()
和page.includeJs()
。
injectJs(filename)
:将本地JavaScript文件加载到页面中并同步评估它。
includeJs(url, callback)
:从指定的网址加载远程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
或利用waitFor
等待,直到出现表示页面已完全加载的元素。这有时候非常棘手。
如果您仍想使用injectJs()
而不是includeJs()
(例如由于其同步性质),那么您需要将外部JavaScript文件下载到您的计算机,然后您可以使用{{ 1}}。