初学Nodejs,关于node-crawler使用的一点问题

初学Nodejs,关于node-crawler使用的一点问题

初学nodejs,想搞个crawler,搜索了下在github上发现有个node-crawler,于是NPM,然后复制范例,编译运行,报错…(范例代码可在github的项目首页上找到)

$("#content a").each(function(a) {
^ TypeError: undefined is not a function
at Object.Crawler.callback (D:\Study\nodejs\myCrawler\index.js:10:9)
at exports.Crawler.self.onContent.jsdom.env.done (D:\Study\nodejs\myCrawler\node_modules\crawler\lib\crawler.js:212:37)
at exports.env.exports.jsdom.env.scriptComplete (D:\Study\nodejs\myCrawler\node_modules\crawler\node_modules\jsdom\lib\jsdom.js:205:39)
at process.startup.processNextTick.process._tickCallback (node.js:244:9)

想来应该是jquery路径的问题?可是我查了貌似没问题啊,我直接NPM的什么都没改啊,麻烦大家帮忙看看可能是什么原因

环境 OS:Windows NodeJS:0.8.15 (x64)


11 回复

根据你提供的错误信息,看起来问题出在 node-crawler 库的版本或者它的依赖项 jsdom 的版本不兼容。错误提示中提到的是一个类型错误(TypeError),表明某些预期是函数的地方实际是 undefined

解决方案

1. 更新 Node.js 版本

首先,确保你的 Node.js 版本是最新的。你正在使用的 Node.js 0.8.15 是非常老的版本,可能会导致很多库不兼容。建议更新到最新稳定版。

你可以通过以下命令检查当前 Node.js 版本:

node -v

安装最新版本的 Node.js 可以通过官方站点下载安装包,或者使用 nvm(Node Version Manager)进行管理。

2. 更新 node-crawler 和 jsdom

确保你安装的是最新版本的 node-crawlerjsdom。可以尝试卸载并重新安装这些库:

npm uninstall node-crawler
npm install node-crawler@latest

同时检查 jsdom 是否也是最新版本:

npm install jsdom@latest

3. 示例代码

下面是一个简单的 node-crawler 使用示例,你可以尝试运行这个代码看看是否能够正常工作:

var Crawler = require("crawler");

var c = new Crawler({
    maxConnections : 10,
    callback : function (error, res, done) {
        if(error){
            console.log(error);
        } else {
            var $ = res.$;
            // $ is Cheerio by default
            //a lean implementation of core jQuery designed specifically for the server
            $("#content a").each(function(a) {
                console.log($(this).text());
            });
        }
        done();
    }
});

// Queue just one URL, but it could be a list of URLs.
c.queue('http://www.example.com');

在这个示例中,我们创建了一个新的 Crawler 实例,并设置了回调函数来处理请求结果。我们使用 Cheerio 来解析 HTML 文档,它类似于 jQuery,但专门为服务器端使用而设计。

如果上述方法仍然无法解决问题,建议查看 node-crawler 的 GitHub 仓库中的 Issues 页面,看看是否有其他人遇到类似的问题以及他们的解决方案。


UP一下,求解…

把你的程序帖上来看看吧。

lz问题解决了么,我也是这样

这个 node-crawler 好像依赖的库很多哦,检查一下是否都全了?猜想是否 jsdom 这个没有呢?

"dependencies": {
   "request": "2.12.0",
   "jsdom": "0.2.19",
   "generic-pool": "2.0.2",
   "htmlparser": "1.7.6",
   "underscore": "1.3.3",
   "jschardet": "1.0.2",
   "iconv-lite": "0.2.7"
}

不用试了win下面用不了。

重新看了下,确实crawler在win下有bug

// jsdom doesn't support adding local scripts,
// We have to read jQuery from the local fs
if (toQueue.jQueryUrl.match(/^(file\:\/\/|\/)/)) {

// TODO cache this fs.readFile(toQueue.jQueryUrl.replace(/^file:///,""),“utf-8”,function(err,jq) {

crawler/lib/crawler.js273行的正则匹配并不适用于win的文件系统,所以读取不到jquery.js了,试着直接改成if(true)就可以正常运行

不过还是推荐自己写crawler,这个crawler只是把几个常用的module组合起来了,过度封装了反而不够灵活

到这下载 windows下编译好的jsdom吧。 https://github.com/mihaifm/jsdom_binaries

node-crawler 在windows就fork我的版本吧,原版有问题 ,估计根本只想在unix系下跑。 https://github.com/hhuai/node-crawler

osx下也不行

从错误信息来看,问题出在尝试使用jQuery选择器时,但环境中没有正确加载jQuery或DOM环境。node-crawler 库并不自带jQuery环境,需要手动引入。

你可以通过以下步骤解决这个问题:

示例代码

首先,安装 node-crawlerjsdom(一个可以提供类似浏览器的DOM环境):

npm install node-crawler jsdom --save

然后编写爬虫脚本:

const Crawler = require("crawler");
const jsdom = require("jsdom");

const c = new Crawler({
  // 你需要定义你的爬虫选项
  maxConnections: 10,
  callback: (error, res, done) => {
    if (error) {
      console.error(error);
    } else {
      const window = new jsdom.JSDOM(res.body).window;
      const $ = require('jquery')(window);

      // 现在你可以使用 jQuery 选择器了
      $("#content a").each((i, elem) => {
        console.log(elem.href);
      });

      done();
    }
  },
});

c.queue("http://example.com");

解释

  1. 安装依赖

    • node-crawler:用于构建爬虫。
    • jsdom:用于创建一个类似于浏览器的DOM环境,使你能够在Node.js中使用jQuery。
  2. 创建DOM环境

    • 使用 jsdom.JSDOM(res.body).window 创建一个DOM环境,这样你就可以在Node.js中使用jQuery了。
  3. 使用jQuery

    • require('jquery')(window) 将jQuery绑定到该DOM环境上,使得你可以使用jQuery选择器。
  4. 处理响应

    • 在回调函数中,你可以在DOM环境中使用jQuery选择器来解析HTML内容。

通过这种方式,你应该能够避免之前遇到的错误,并且可以顺利地使用jQuery选择器进行网页解析。

回到顶部