Сканирование веб-страницы, отображаемой с помощью JavaScript.PhtantomJs или любой другой инструмент? - PullRequest
2 голосов
/ 03 апреля 2019

Я создаю инструмент для сканирования страницы и локального сохранения ее HTML.

Также загрузите этот HTML-код на веб-страницу с помощью iframe.Поэтому у меня есть события unbind и bind на просканированной странице.

Я использую 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();
}

1 Ответ

0 голосов
/ 03 апреля 2019

вместо использования SetTimeout с 200 мс, я думаю, что будет лучше внедрить прокрутку скрипта на сайт, который вы хотите загрузить, так вы избежите случаев использования сайтов windowing

вот пример, сделанный с кукловодом , записанным в узле

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...