Nodejs:现在用node写网页爬虫用phantomjs和jsdom各有什么利弊?
Nodejs:现在用node写网页爬虫用phantomjs和jsdom各有什么利弊?
目前用phantomjs 遇到很多问题。 看了网上的demo 用child_process来调用phantomjs 只能从stdout获取数据,或者用phantomjs写到文件里再用node打开文件获取数据。 phantomjs开发时不好调试,有时报错stdout就卡着不动了,没法查问题。
jsdom就好多了 可以用jquery直接抓dom
Node.js:现在用Node写网页爬虫用PhantomJS和JSDOM各有什么利弊?
PhantomJS
优点:
- 全页面渲染: PhantomJS 是一个无头浏览器(headless browser),能够完全加载并渲染页面,包括JavaScript、CSS和其他资源。这使得它可以用于那些需要完整页面渲染的场景。
- 自动化测试: 它最初设计用于自动化测试,因此它支持事件模拟和页面交互。
缺点:
- 维护问题: 自2018年3月起,PhantomJS项目已被废弃,不再接受新功能或错误修复。这意味着长期来看,使用PhantomJS可能会面临更多的兼容性和安全风险。
- 性能问题: PhantomJS在处理大量请求时可能会出现性能瓶颈,尤其是在高并发场景下。
- 调试困难: 使用PhantomJS进行开发和调试比较麻烦,因为它不提供方便的调试工具,错误信息输出可能不够详细。
示例代码:
const phantom = require('phantom');
async function run() {
const instance = await phantom.create();
const page = await instance.createPage();
const status = await page.open('http://example.com');
console.log(status);
const content = await page.property('content');
console.log(content);
await instance.exit();
}
run().catch(console.error);
JSDOM
优点:
- 轻量级: JSDOM是一个纯JavaScript库,不需要启动额外的进程或依赖外部工具,因此它更轻量级且易于集成。
- 易于调试: JSDOM可以在Node.js环境中直接运行,并且可以使用标准的调试工具(如
console.log
)进行调试。 - 灵活性: JSDOM允许你操作DOM树,使用jQuery等库轻松地抓取DOM元素。
缺点:
- 缺乏完整的浏览器环境: JSDOM不支持一些浏览器特有的API,例如
window.location
、XMLHttpRequest
等。这意味着对于某些复杂的Web应用,JSDOM可能无法完全模拟其行为。 - 性能问题: 对于需要执行大量JavaScript的页面,JSDOM的性能可能不如PhantomJS。
示例代码:
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
const document = dom.window.document;
console.log(document.querySelector("p").textContent); // "Hello world"
总结来说,如果你需要一个轻量级且易于调试的解决方案,JSDOM是一个很好的选择。而如果你需要一个能够完全渲染页面并支持复杂交互的解决方案,PhantomJS在过去可能是更好的选择,但考虑到它已经被废弃,建议寻找替代方案,如Puppeteer。
cherrio …
一般用request & cherrio基本就没问题了,有ajax的上phantomjs
顶
+1
node.js 调试确实头疼。。
用宝石写爬虫不是更好么?
对于ajax的页面,我只好用phantom了。。。但也遇到和楼主一样的困惑,非得将数据拉下来写文件,再让node拿,感觉好不爽。至于解析dom,推荐cherrio。
node.js调试再简单不过了吧,连ide都不用,试试node-inspector
宝石有什么高明之处?
这坟挖的,cnodejs是不是要考虑下跟v2ex一样的帖子排序
使用PhantomJS和jsdom在Node.js中编写网页爬虫各有优缺点。下面是两者的对比及其示例代码:
PhantomJS
优点:
- 完整浏览器环境:PhantomJS是一个无头浏览器,提供了完整的DOM操作能力。
- JavaScript执行:可以运行复杂的JavaScript代码,适用于需要页面渲染或JavaScript执行的场景。
缺点:
- 维护性差:PhantomJS项目已经停止维护,最新版本发布于2018年。
- 性能问题:作为一个浏览器模拟器,它相对较重,性能不如其他解决方案。
- 调试困难:如您所提到的,错误处理和调试相对困难。
示例代码:
const phantom = require('phantom');
(async () => {
const instance = await phantom.create();
const page = await instance.createPage();
const status = await page.open('http://example.com');
console.log(status); // 'success'
const content = await page.evaluate((_) => document.querySelector('h1').innerText, []);
console.log(content);
await instance.exit();
})();
jsdom
优点:
- 轻量级:jsdom是纯JavaScript实现的DOM解析器,不需要额外的浏览器环境。
- 易用性:可以方便地与Node.js生态系统中的其他工具集成,例如axios、fetch等。
- 易于调试:由于没有浏览器模拟,调试过程更为简单。
缺点:
- 不支持所有浏览器API:jsdom仅提供了一个基本的DOM环境,可能缺少某些浏览器API。
- 依赖于静态HTML:如果目标网站依赖于动态加载的JavaScript内容,jsdom可能无法正确解析这些内容。
示例代码:
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const dom = new JSDOM(`<!DOCTYPE html><div>Hello World</div>`);
const document = dom.window.document;
console.log(document.querySelector('div').textContent); // 'Hello World'
总结来说,如果您需要一个完整的浏览器环境来执行JavaScript,PhantomJS可能是一个选择,但由于其不再维护,jsdom更推荐用于当前的项目。