【问题标题】:Node Cheerio to scrape an entire site节点 Cheerio 抓取整个站点
【发布时间】:2013-11-26 14:39:08
【问题描述】:

有没有人使用 Node Cheerio 来抓取整个网站,而不仅仅是抓取器指向的主页/首页?

目前我正在执行以下仅抓取目标页面的操作。

request('http://arandomsite.com/', function (error, response, html) {
    if (!error && response.statusCode == 200){
        var $ = cheerio.load(html);
            ...
            ...
            ...
};

【问题讨论】:

    标签: javascript node.js web-scraping web-crawler cheerio


    【解决方案1】:

    我从未使用过 Cheerio,但我会假设(与其他刮刀一样),它只会执行您指向的页面。假设 Cheerio.load 返回类似 api 的 jquery,您可能需要执行类似

    的操作
    $('a').each(function(index, a) {
        //TODO: You may want to keep track here of which you have done, and not redo any.
        request('http://arandomsite.com' + a.attr('href'), myPageProcessFunction);
    });
    

    显然,您还需要添加 iframe 之类的内容,以确保获得完整的结果。

    为了澄清,这里是一些更新的代码:

    request('http://arandomsite.com/', function responseFunction(error, response, html) {
    if (!error && response.statusCode == 200){
        var $ = cheerio.load(html);
        $('a').each(function(index, a) {
            request('http://arandomsite.com' + a.attr('href'), responseFunction);
        });
    };
    });
    

    【讨论】:

    • 唯一的问题是请求函数在我的节点依赖变量的正下方,所以我可以看到的一个问题是通过将请求包装在$('a').each(function(index, a) { }; 中会导致 $ 是未定义。
    • 我的意思不是包装请求。加载 $ 后,此代码应在请求中。当我在每个链接上说调用请求时,我的意思是进行新的请求调用,并将当前函数作为回调结果传递。
    • 我明白你的逻辑,感谢更新的代码,这很有意义。我唯一没有的问题是它说a没有方法'attr'?这是一个包含完整代码的馅饼的链接,让您更好地了解我在做什么pastie.org/private/snykxn92q23ga8srnpak3a#1,7
    • 我猜它传递了实际的锚元素。在这种情况下,您应该能够更改为 a.href(而不是 a.attr('href'))
    • 嗯...就像我说的,我从未使用过它,但它应该很接近。开发人员的回应只是告诉你做我们正在做的事情。也许,作为最后一次尝试,您可以尝试 $(a)​​.attr('href')。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 2018-11-20
    • 2019-08-05
    • 2011-07-28
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多