programing

PhantomJS 및 node.js로 웹 페이지 저장 및 렌더링

nasanasas 2020. 12. 9. 08:18
반응형

PhantomJS 및 node.js로 웹 페이지 저장 및 렌더링


웹 페이지를 요청하고 JavaScript가 렌더링 될 때까지 기다린 다음 (JavaScript가 DOM을 수정 함) 페이지의 HTML을 가져 오는 예제를 찾고 있습니다.

이것은 PhantomJS에 대한 명백한 사용 사례가있는 간단한 예입니다. 괜찮은 예를 찾을 수 없습니다. 문서는 명령 줄 사용에 관한 것 같습니다.


귀하의 의견에서 두 가지 옵션이 있다고 생각합니다.

  1. - phantomjs 노드 모듈 찾아보십시오 https://github.com/amir20/phantomjs-node을
  2. - 자식 프로세스의 내부 노드로 실행 phantomjs http://nodejs.org/api/child_process.html

편집하다:

phantomjs가 노드와 상호 작용하는 방법으로 자식 프로세스를 제안한 것 같습니다. FAQ- http : //code.google.com/p/phantomjs/wiki/FAQ 참조

편집하다:

페이지 HTML 마크 업을 얻기위한 Phantomjs 스크립트의 예 :

var page = require('webpage').create();  
page.open('http://www.google.com', function (status) {
    if (status !== 'success') {
        console.log('Unable to access network');
    } else {
        var p = page.evaluate(function () {
            return document.getElementsByTagName('html')[0].innerHTML
        });
        console.log(p);
    }
    phantom.exit();
});

v2를 사용하면 phantomjs-node처리 된 후 HTML을 인쇄하기가 매우 쉽습니다.

var phantom = require('phantom');

phantom.create().then(function(ph) {
  ph.createPage().then(function(page) {
    page.open('https://stackoverflow.com/').then(function(status) {
      console.log(status);
      page.property('content').then(function(content) {
        console.log(content);
        page.close();
        ph.exit();
      });
    });
  });
});

그러면 브라우저에서 렌더링 된 것처럼 출력이 표시됩니다.

2019 수정 :

다음을 사용할 수 있습니다 async/await.

const phantom = require('phantom');

(async function() {
  const instance = await phantom.create();
  const page = await instance.createPage();
  await page.on('onResourceRequested', function(requestData) {
    console.info('Requesting', requestData.url);
  });

  const status = await page.open('https://stackoverflow.com/');
  const content = await page.property('content');
  console.log(content);

  await instance.exit();
})();

또는 테스트하고 싶다면 다음을 사용할 수 있습니다. npx

npx phantom@latest https://stackoverflow.com/

나는 Declan이 언급 한 DOM을 쿼리하는 page.evaluate () 메서드를 포함하여 과거에 두 가지 다른 방법을 사용했습니다. 웹 페이지에서 정보를 전달한 다른 방법은 거기에서 console.log ()로 정보를 내보내고 phantomjs 스크립트에서 다음을 사용하는 것입니다.

page.onConsoleMessage = function (msg, line, source) {
  console.log('console [' +source +':' +line +']> ' +msg);
}

또한 onConsoleMessage에서 msg 변수를 트랩하고 일부 캡슐화 데이터를 검색 할 수도 있습니다. 출력을 사용하려는 방법에 따라 다릅니다.

그런 다음 Nodejs 스크립트에서 Phantomjs 스크립트의 출력을 스캔해야합니다.

var yourfunc = function(...params...) {
  var phantom = spawn('phantomjs', [...args]);
  phantom.stdout.setEncoding('utf8');
  phantom.stdout.on('data', function(data) {
    //parse or echo data
    var str_phantom_output = data.toString();
    // The above will get triggered one or more times, so you'll need to
    // add code to parse for whatever info you're expecting from the browser
  });
  phantom.stderr.on('data', function(data) {
    // do something with error data
  });
  phantom.on('exit', function(code) {
    if (code !== 0) {
      // console.log('phantomjs exited with code ' +code);
    } else {
      // clean exit: do something else such as a passed-in callback
    }
  });
}

희망이 있습니다.


왜 이것을 사용하지 않습니까?

var page = require('webpage').create();
page.open("http://example.com", function (status)
{
    if (status !== 'success') 
    {
        console.log('FAIL to load the address');            
    } 
    else 
    {
        console.log('Success in fetching the page');
        console.log(page.content);
    }
    phantom.exit();
});

Late update in case anyone stumbles on this question:

A project on GitHub developed by a colleague of mine exactly aims at helping you do that: https://github.com/vmeurisse/phantomCrawl.

It still a bit young, it certainly is missing some documentation, but the example provided should help doing basic crawling.


Here's an old version that I use running node, express and phantomjs which saves out the page as a .png. You could tweak it fairly quickly to get the html.

https://github.com/wehrhaus/sitescrape.git

참고URL : https://stackoverflow.com/questions/9966826/save-and-render-a-webpage-with-phantomjs-and-node-js

반응형