Node.js使用npm抓取工具进行爬网错误

时间:2017-06-01 04:12:23

标签: jquery node.js npm web-crawler

使用npm抓取工具抓取链接时,出现错误:

C:\Users\ryani\Desktop\JavaScript\crawler\crawler.js:15
                                $('a').each(function(index, value) {
                                      ^

TypeError: Cannot read property 'each' of undefined

我已经尝试过设置超时和各种调试技术......我不确定为什么它会变得不确定;当我将代码放在html页面上的标签中时,它可以正常工作。

crawler.js:

var Crawler = require("crawler");

var c = new Crawler({
    "maxConnections":10,

    "callback":function(error, res, $) {

        if (error) {
            console.log("error");
            console.log(error);
        } else {
            $('a').each(function(index, value) {
                console.log($(this).attr('href'));
                //c.queue(href)
            });
        }
    }
});

c.queue('http://www.google.com');

2 个答案:

答案 0 :(得分:2)

问题是你没有初始化Cheerio(var $ = res。$;)。

试试这个,从提供的网址中提取所有喜欢的内容...

var Crawler = require("crawler");

var c = new Crawler({
    maxConnections: 10,
    // This will be called for each crawled page 
    callback: function(error, res, done) {
        if (error) {
            console.log(error);
        } else {
            var $ = res.$;
            var links = [];

            $('a').each(function(i, elem) {
                links[i] = $(this).attr('href');
            });
            // $ is Cheerio by default 
            //a lean implementation of core jQuery designed specifically for the server 
            console.log(links);
        }
        done();
    }
});

c.queue('http://www.google.com');

答案 1 :(得分:2)

我之前从未使用过Crawler节点模块,但查看了here找到的用法示例。

回调函数的3个参数是;

  1. 错误 - 爬网程序API可能返回的潜在错误
  2. res - 响应对象,$是其属性中的一个
  3. done - 代码在完成处理时将调用的另一个回调函数。
  4. 通过将代码编写为callback :function(error, res, $) {$变量位于参数的第3位,因此基本上它被用来表示done函数。现在你说done$这是不正确的,因为函数对象没有那个属性,因而错误。

    也就是说,您的代码应该类似于:

        res.$('a').each(function(i, elem) {
            links[i] = $(this).attr('href');
        });
    

    此外,您需要调用done参数,否则进程将卡在那里。例如$()。但是我建议你按照他们的代码示例,因为$不是一个好的变量名。建议将第三个变量$重命名为done