抓取通过JavaScript呈现的网页。 PhtantomJs还是其他任何工具?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抓取通过JavaScript呈现的网页。 PhtantomJs还是其他任何工具?相关的知识,希望对你有一定的参考价值。
我正在构建一个工具来抓取页面并在本地存储其html。
还可以使用iframe在网页上加载HTML。所以我在已抓取的页面上取消绑定并绑定事件。
我正在使用PhantomJS来获取网页数据。
通过javascript呈现数据的网页无法进行爬网。 PhantomJs有什么方法可以这样做吗?
使用PhantomJs加载页面后获取网页数据的代码是:
用于shell的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();
}
答案
而不是使用200ms的SetTimeout我认为将脚本向下滚动到你想要下载的网站会更好,这就是你如何使用窗口来避免网站的情况
这是用节点写的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);
以上是关于抓取通过JavaScript呈现的网页。 PhtantomJs还是其他任何工具?的主要内容,如果未能解决你的问题,请参考以下文章
javascript 从网页或服务中抓取js呈现的,代理响应的简单方法。 https://www.scraperapi.com/documentation