我正在构建一个工具来抓取页面并将其html存储在本地。
也可以使用iframe将HTML加载到网页上。因此,我已取消绑定并绑定了已爬网页面上的事件。
我正在使用PhantomJS来获取网页数据。
通过JavaScript呈现数据的网页无法进行爬网。 PhantomJs中有什么方法可以这样做吗?
使用PhantomJs加载页面后获取网页数据的代码为:
PHP代码可用于执行phantomJs命令
$shelldata = exec(PHATOM_JS_PATH."bin/phantomjs ".PHATOM_JS_PATH."/phantomcode.js $WEB_URL > webpage.html 2>&1");
示例1
var system = require('system');
var page = require('webpage').create();
var args = system.args;
page.onLoadFinished = function(status) {
// console.log('Status: ' + status);
console.log(page.content);
phantom.exit();
};
if(args.length > 1){
page.open(args[1], function(status) {
if(status == "success"){
}else{
console.log("Invalid");
phantom.exit();
}
});
}else{
console.log("Invalid");
phantom.exit();
}
示例2
var system = require('system');
var page = require('webpage').create();
var args = system.args;
if(args.length > 1){
page.open(args[1], function(status) {
if(status == "success"){
setTimeout(function() {
console.log(page.content);
phantom.exit();
}, 200);
}else{
console.log("Invalid");
phantom.exit();
}
});
}else{
console.log("Invalid");
phantom.exit();
}
答案 0 :(得分:0)
与使用200ms的SetTimeout相比,我认为最好将向下滚动的脚本注入要下载的网站,这样可以避免使用 windowing
这是用写在节点上的puppeteer制成的精品
const puppeteer = require("puppeteer");
const fs = require("fs");
const injectionPath = "scrollInjection.js";
const writeContent = (content)=>{
fs.writeFile("./test/pageoutput", content, function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
});
}
const delay = time => {
return new Promise(function(resolve) {
setTimeout(resolve, time);
});
};
let run = async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
//wait for page to fully loaded
await page.goto(
"URL TO GO TO"
);
//inject scrolling down script
await page
.evaluate(fs.readFileSync(injectionPath, "utf8"))
.catch(err => console.log(err));
//scroll down for x sec
await delay("HOW MUCH TIME TO SCROLL DOWN THE PAGE ");
// get page content
const html = await page.content();
writeContent(html)
await browser.close();
};
run();
injectionFile.js
function myTimer() {
window.scrollTo(0, document.body.scrollHeight);
}
var scroller = setInterval(function() {
myTimer();
}, 1000);