Nodejs:现在用node写网页爬虫用phantomjs和jsdom各有什么利弊?

Nodejs:现在用node写网页爬虫用phantomjs和jsdom各有什么利弊?

目前用phantomjs 遇到很多问题。 看了网上的demo 用child_process来调用phantomjs 只能从stdout获取数据,或者用phantomjs写到文件里再用node打开文件获取数据。 phantomjs开发时不好调试,有时报错stdout就卡着不动了,没法查问题。

jsdom就好多了 可以用jquery直接抓dom

13 回复

Node.js:现在用Node写网页爬虫用PhantomJS和JSDOM各有什么利弊?

PhantomJS

优点:

  1. 全页面渲染: PhantomJS 是一个无头浏览器(headless browser),能够完全加载并渲染页面,包括JavaScript、CSS和其他资源。这使得它可以用于那些需要完整页面渲染的场景。
  2. 自动化测试: 它最初设计用于自动化测试,因此它支持事件模拟和页面交互。

缺点:

  1. 维护问题: 自2018年3月起,PhantomJS项目已被废弃,不再接受新功能或错误修复。这意味着长期来看,使用PhantomJS可能会面临更多的兼容性和安全风险。
  2. 性能问题: PhantomJS在处理大量请求时可能会出现性能瓶颈,尤其是在高并发场景下。
  3. 调试困难: 使用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

优点:

  1. 轻量级: JSDOM是一个纯JavaScript库,不需要启动额外的进程或依赖外部工具,因此它更轻量级且易于集成。
  2. 易于调试: JSDOM可以在Node.js环境中直接运行,并且可以使用标准的调试工具(如console.log)进行调试。
  3. 灵活性: JSDOM允许你操作DOM树,使用jQuery等库轻松地抓取DOM元素。

缺点:

  1. 缺乏完整的浏览器环境: JSDOM不支持一些浏览器特有的API,例如window.locationXMLHttpRequest等。这意味着对于某些复杂的Web应用,JSDOM可能无法完全模拟其行为。
  2. 性能问题: 对于需要执行大量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

这两样不能一起比吧?

node.js 调试确实头疼。。

用宝石写爬虫不是更好么?

对于ajax的页面,我只好用phantom了。。。但也遇到和楼主一样的困惑,非得将数据拉下来写文件,再让node拿,感觉好不爽。至于解析dom,推荐cherrio。

node.js调试再简单不过了吧,连ide都不用,试试node-inspector

宝石有什么高明之处?

这坟挖的,cnodejs是不是要考虑下跟v2ex一样的帖子排序

使用PhantomJS和jsdom在Node.js中编写网页爬虫各有优缺点。下面是两者的对比及其示例代码:

PhantomJS

优点

  1. 完整浏览器环境:PhantomJS是一个无头浏览器,提供了完整的DOM操作能力。
  2. JavaScript执行:可以运行复杂的JavaScript代码,适用于需要页面渲染或JavaScript执行的场景。

缺点

  1. 维护性差:PhantomJS项目已经停止维护,最新版本发布于2018年。
  2. 性能问题:作为一个浏览器模拟器,它相对较重,性能不如其他解决方案。
  3. 调试困难:如您所提到的,错误处理和调试相对困难。

示例代码

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

优点

  1. 轻量级:jsdom是纯JavaScript实现的DOM解析器,不需要额外的浏览器环境。
  2. 易用性:可以方便地与Node.js生态系统中的其他工具集成,例如axios、fetch等。
  3. 易于调试:由于没有浏览器模拟,调试过程更为简单。

缺点

  1. 不支持所有浏览器API:jsdom仅提供了一个基本的DOM环境,可能缺少某些浏览器API。
  2. 依赖于静态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更推荐用于当前的项目。

回到顶部