Node爬虫
Node爬虫
所谓的爬虫就是发送请求,并将响应的数据做一些处理
只不过不用浏览器来发送请求
需要的模块
- 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/
获取网页数据
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);
}
});
});
}
解析
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
.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的话
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);
})
Node爬虫的更多相关文章
- 继续node爬虫 — 百行代码自制自动AC机器人日解千题攻占HDOJ
前言 不说话,先猛戳 Ranklist 看我排名. 这是用 node 自动刷题大概半天的 "战绩",本文就来为大家简单讲解下如何用 node 做一个 "自动AC机&quo ...
- node爬虫gbk中文乱码问题
刚入坑node 写第二个node爬虫时,遇到了这个坑,记录一下. 主要步骤: 1.安装iconv-lite 输入npm install iconv-lite 2.将接收到的网页源码以二进制的方式存储下 ...
- 简单的node爬虫练手,循环中的异步转同步
简单的node爬虫练手,循环中的异步转同步 转载:https://blog.csdn.net/qq_24504525/article/details/77856989 看到网上一些基于node做的爬虫 ...
- node爬虫(简版)
做node爬虫,首先像如何的去做这个爬虫,首先先想下思路,我这里要爬取一个页面的数据,要调取网页的数据,转换成页面格式(html+div)格式,然后提取里面独特的属性值,再把你提取的值,传送给你的页面 ...
- node 爬虫 --- 批量下载图片
步骤一:创建项目 npm init 步骤二:安装 request,cheerio,async 三个模块 request 用于请求地址和快速下载图片流. https://github.com/reque ...
- node爬虫的几种简易实现方式
说到爬虫大家可能会觉得很NB的东西,可以爬小电影,羞羞图,没错就是这样的.在node爬虫方面,我也是个新人,这篇文章主要是给大家分享几种实现node 爬虫的方式.第一种方式,采用node,js中的 s ...
- node爬虫之gbk网页中文乱码解决方案
之前在用 node 做爬虫时碰到的中文乱码问题一直没有解决,今天整理下备忘.(PS:网上一些解决方案都已经不行了) 中文乱码具体是指用 node 请求 gbk 编码的网页,无法正确获取网页中的中文(需 ...
- 有趣的Node爬虫,数据导出成Excel
最近一直没更新了诶,因为学习Backbone好头痛,别问我为什么不继续AngularJs~因为2.0要出来了啊,妈蛋!好,言归正传,最近帮我的好基友扒数据,他说要一些股票债券的数据.我一听,那不就是要 ...
- 200行的Node爬虫花了半天的时间把网易云上的30万首歌曲信息都抓取回来了
早两天在网易云听歌看评论的时候,突然想把网易云上所有歌曲都抓取下来然后按照评论数进行一次排名,把评论数超过10万的歌曲都听一次,于是便有了这个项目. 因为只是一个小前端,所以使用了Node来写这个爬虫 ...
随机推荐
- Properties文件的XML格式(转)
想必大家都用过*.properties文件,作为配置文件.但是,如果该文件写入了中文,待编译后内容就会成为乱码,使用native命令也好.使用ant执行编码转换也好,多少有点麻烦,与其如此,我们不如直 ...
- select函数的简单使用
server: socket()->bind()->listen()->FD_SET()->select()->accept()->FD_SET()->sel ...
- HTTP POST和GET的区别[转]
http://www.cppblog.com/woaidongmao/archive/2008/05/29/51476.aspx 1.HTTP 只有POST和GET 两种命令模式: 2.POST是被设 ...
- centos5.5用phpstudy一键安装配置虚拟主机后,yum配置代理服务器squid
最近因为工作需要,开发站点需要在lamp环境下跑网站,于是在win7上跑虚拟机装了一个centos5.5的linux 并用集成环境配置了一个lamp环境,这里用的是phpstudy的一键安装包,并配置 ...
- 在struts2中整合ajax时出现Template /template/ajax/head.ftl not found错误时的处理方法
Struts2 Ajax出现错误“Template /template/ajax/head.ftl not found” 2013-02-08 18:26:27| 分类: 默认分类|字号 订阅 ...
- Android R.layout. 找不到已存在的布局文件
今天写新页面的时候,突然发现R.layout. 无法找到我已经写好的页面,于是顿时就不淡定了. 把R文件翻了一遍 发现也没有.... 然后我就看到了这个. android.R 原来是我错把Andr ...
- view里文书删除时报错的解决案
- python Memo
list&tuple 运算 乘以constant >>> x = ((1,2),) >>> x*2 ((1, 2), (1, 2)) >>> ...
- mini-httpd源码分析-mini-httpd.c之外总结
version.h #define SERVER_SOFTWARE "mini_httpd/1.21 18oct2014" #define SERVER_URL "htt ...
- C++中的引用到底是什么
这也算是一个老生常谈的问题,写这个其实就是想趁着暑假把博客丰富一下. 咱随便在谷哥.度娘.病软引擎上搜搜都可以得到各种关于引用的解释,无非就是"引用不同于指针,引用是一个变量的别名" ...