Node爬虫

news/2024/7/19 9:31:28 标签: 爬虫, javascript

爬虫">Node爬虫

参考
http://www.cnblogs.com/edwardstudy/p/4133421.html

所谓的爬虫就是发送请求,并将响应的数据做一些处理
只不过不用浏览器来发送请求

需要的模块

  • superagent
  • url (解析url用 因为在node中没有document)
  • cheerio (将文本解析为JQ的DOM对象)
    其它
    q(promise) eventproxy

superagent

SuperAgent 是一个轻量的Ajax API,服务器端(Node.js)客户端(浏览器端)均可使用, 可作为客户端请求代理模块使用,当你想处理get,post,put,delete,head请求时,可以考虑使用SuperAgent

http://www.tuicool.com/articles/MbEnQfQ
https://visionmedia.github.io/superagent/

获取网页数据

javascript">var targetUrl = 'https://cnodejs.org/';

function getRawData(){
    return Q.promise(function(resolve, reject){
        superagent.get(targetUrl)
            .end(function(err, res) {
                if(err){
                    reject(err);
                }else{
                    //console.log(res);//返回的格式包含Header   Response Connection等很多信息 //而网页本身的内容则在text中
                    resolve(res);
                }
            });
    });
}

解析

javascript">getRawData().then(function(res){
    // console.log(res.text);
    return cheerio.load(res.text);  //之后返回的是一个经过JQ的body对象 如同$(document.body)一样
}, function(err){
    console.log(err);
}).then(function($){
    var topicUrls = [];
    $('#topic_list .topic_title').each(function(idx,ele){
        ele = $(ele);
        var href = url.resolve(targetUrl, ele.attr('href'));
        topicUrls.push(href);
    });
    return topicUrls;
})

More

javascript">.then(function(urls){
    var ep = new eventproxy();
    //这里使用Promise.all 也是Ok的
    //enevtProxy 可以再监听到指定次数的事件后触发
    ep.after('topic', urls.length, function(topics){
        topics = topics.map(function(item){
            var text = item.text;
            var $ = cheerio.load(item.text);
            return {
                href: item.url,
                title: $('.topic_full_title').html() ? $('.topic_full_title').html() : '',
                comment: $('.reply_content').eq(0).text() ? $('.reply_content').eq(0).text() : ''
            }
        });
        console.log(topics);
    });
    urls.forEach(function(url){
        superagent.get(url).end(function(err, res){
            ep.emit('topic', {
                url:url,
                text: res.text
            });
        })
    });
});

使用Promise的话

javascript">    var promises = urls.map(function(url){
        return Q.promise(function(resolve, reject){
            superagent.get(url).end(function(err,res){
                resolve({
                    url: url,
                    text: res.text
                });
            });
        });
    });
    Q.all(promises).then(function(arr){
        console.log('-------------all-------------');
        arr = arr.map(function(item){
            var $ = cheerio.load(item.text);
            return {
                href: item.url,
                title: $('.topic_full_title').html() ? $('.topic_full_title').html() : '',
                comment: $('.reply_content').eq(0).text() ? $('.reply_content').eq(0).text() : ''
            }
        });
        console.log(arr);
    })

转载于:https://www.cnblogs.com/cart55free99/p/4780152.html


http://www.niftyadmin.cn/n/1833137.html

相关文章

MySQL数据库的单表基本操作(二,附加职工小练习)

数据库的增删查改是基础,所以小编要增加练习,与增加训练来增加自己的基础,确实上百度上有许多的博客,大家可以参考参考多加练习。废话不多说,开干。 表的约束: NOT NULL非空UNIQUE Key唯一键PRIMARY KEY主…

我对UNIX的理解

1994年,X Window系统开发组的成员Mike Gancarz根据他自己的Unix系统经验以及和其他领域使用Unix系统的资深程序员们的讨论结果,写成了《The UNIX Philosophy》,提出了9条训格之言: 一:小即是美。二:让程序只…

测试小白必备基础知识总结

什么是软件测试 软件测试是使用人工操作或者软件自动运行的方式来检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别的过程。 本质:软件测试是为发现软件错误而执行程序的过程。 例如场景:淘宝网用户登陆 大家都有在淘宝购物的经历吧&#xf…

hdu 3987(求割边最小的最小割)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid3987 思路:我们知道最小割是不唯一的,这里要我们求割边最少的最小割,比较好做法有: 第一种: 建边的时候每条边权 w w * (E 1) 1; 这样得到最…

[Linux] - Virtualbox-CentOS动态增加分区空间方法

VirtualBox使用中,有时会因为当初分配空间不足导致出问题,可以使用如下方式增加分区空间: 一、VirtualBox设置: 1)到VirtualBox的安装目录下找到这个命令exe文件:vboxmanage.exe 2)运行命令&…

Atitit.异常的设计原理与 策略处理 java 最佳实践 p93

Atitit.异常的设计原理与 策略处理 java 最佳实践 p93 1 异常方面的使用准则,答案是::2 1.1 普通项目优先使用异常取代返回值,如果开发类库方面的项目,最好异常机制与返回值都提供,由调用者决定使用哪种方…

计算输入数的位数

计算输入数字的位数 对数字进行整除运算&#xff0c;number/10对输入的负数将负数变为正数参与运算(不考虑负号)考虑数字0的特殊我使用do while #include<stdio.h>int main(){int number;//存输入的数字 int count0;//计数 int a0;scanf("%d",&number);a…

c语言输入数的逆序

为了重复输入加了一个while循环&#xff0c;循环5次 只计算大于等于0的数值 #include<stdio.h>int main(){//将输入的数逆序/*对输入数进行取余%10 一个变量存储余数 将最右边的数去除后的数后赋值给原来的数 将所取余的数*10加在一起赋值给定义好的变量&#xff0c;放在…