PhantomJS 및 node.js로 웹 페이지 저장 및 렌더링
웹 페이지를 요청하고 JavaScript가 렌더링 될 때까지 기다린 다음 (JavaScript가 DOM을 수정 함) 페이지의 HTML을 가져 오는 예제를 찾고 있습니다.
이것은 PhantomJS에 대한 명백한 사용 사례가있는 간단한 예입니다. 괜찮은 예를 찾을 수 없습니다. 문서는 명령 줄 사용에 관한 것 같습니다.
귀하의 의견에서 두 가지 옵션이 있다고 생각합니다.
- - phantomjs 노드 모듈 찾아보십시오 https://github.com/amir20/phantomjs-node을
- - 자식 프로세스의 내부 노드로 실행 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
'programing' 카테고리의 다른 글
PC간에 모든 ReSharper 설정 전송 (0) | 2020.12.09 |
---|---|
HTTP URL의 경로 부분에있는 인코딩 된 슬래시 ( "% 2F")에 해당하는 슬래시 ( "/")입니다. (0) | 2020.12.09 |
Android 휴대폰에서 네트워크 활동 모니터링 (0) | 2020.12.09 |
IntelliJ가 내 소스 코드에만 들어가도록 강제하는 방법은 무엇입니까? (0) | 2020.12.09 |
Webpack : 플러그인 순서가 중요합니까? (0) | 2020.12.09 |