使用 node.js 在 Windows 上抓取网站

Posted

技术标签:

【中文标题】使用 node.js 在 Windows 上抓取网站【英文标题】:use node.js to scrape web site on Windows 【发布时间】:2011-12-09 17:05:03 【问题描述】:

试图让 jsdom(node.js 模块)在 Windows 上工作。 一直抱怨没有为我的节点版本构建。

在 linux 机器上安装了节点(相同版本,0.5.9,来自源代码)并对其进行了节点处理。 然后我将它复制到 Windows 机器(在 node_modules 下)

还是不行……

有什么想法吗?还是从对节点发出的请求的响应中获得的解析 html 的其他建议?

通过 jsdom 使用 jquery 会很不错。

干杯。

【问题讨论】:

【参考方案1】:

很抱歉,jsdom (>=0.2.3) 目前需要一个 c++ 插件,它不能很好地与 Windows 配合使用。我认为你最好的办法是尝试安装 jsdom@0.2.1 并解决在 jsdom 的窗口上下文中执行 javascript 导致的内存泄漏。

解决方法包括:

为每个 dom 生成一个新进程 重用一个窗口并通过document.body.innerHTML = '..new markup..';替换DOM

我们的目的是远离 c++ 插件,但不幸的是,目前不可能。

【讨论】:

【参考方案2】:

如果 node.js 不是绝对必须的,请查看我们的 SO-ist @nrabinowitz 的 pjscrape。它已经过测试和证明。

此外,node-scraper 似乎是适合您工作的工具,它有 222 个观察者和 11 个分叉,它似乎也很活跃。可以在readme 或right here on SO 中找到用例。

【讨论】:

好的,我已经检查过了。不去。 node-scraper 需要 contextify,同样的错误 无法安装 contextify。它抱怨它还没有为我的节点版本(Windows 上的 0.5.9)构建。由于windows上没有node-waf,我尝试在linux上安装node 0.5.9,下载contextify并构建它,然后将其传输到windows上的node_modules文件夹,但它仍然在抱怨。【参考方案3】:

我不确定您到底想做什么,但node.io has a scraping framework 可能符合要求。

【讨论】:

谢谢,我也去看看。 不行。抱怨缺少模块,甚至没有告诉我它是哪个模块。 如果您使用的是 windows,则需要查看 package.js 文件并手动下载解决依赖关系所需的模块。或者您可以在 Windows 上尝试 npm 的实验版本并执行 npm install (check the readme)。 好吧,这取决于jsdom,这是最初的问题。【参考方案4】:

一直在玩node.js模块Cheerio,和jsdom相比,是:

更快 更容易安装 对损坏的 HTML 更具弹性(与 jsdom 相比) 并提供了您将在服务器端使用的大部分 jQuery 函数

http://matthewmueller.github.com/cheerio/


抓取示例:

var request = require('request'),
    cheerio = require('cheerio');

request('http://encosia.com', function(error, response, body) 

  // Hand the HTML response off to Cheerio and assign that to
  // a local $ variable to provide familiar jQuery syntax.
  var $ = cheerio.load(body);

  // Exactly the same code that we used in the browser before:
  $('h2').each(function() 
      console.log($(this).text());
  );

);

【讨论】:

以上是关于使用 node.js 在 Windows 上抓取网站的主要内容,如果未能解决你的问题,请参考以下文章

周五免费直播 | Node.JS实战:爬虫抓取花瓣网图片饥人谷

使用 Node.js 和 Cheerio 抓取公司名称

使用 Node.js 进行网页抓取

安装Node.js和npm

在 Node.Js 中使用请求抓取 javascript 生成的内容

在 Node.Js 中使用请求抓取 javascript 生成的内容