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来写这个爬虫 ...
随机推荐
- C#中的Attributes的用法
今天研究了一下C#中的Attributes的用法,感觉很有用,现总结以下: 在前台用JS写的脚本方法,除了可以直接用在前台控件的属性中,还可以在后台运用. 即在后台页面加载时,调用JS方法.语法格式有 ...
- 基于lua+nginx的abtest系统
指定一个参数 这个参数可以标识客户端唯一id的,比如用户id等 拿到这个id根据系统的hash算法会hash出一个bucket,目前支持的桶总数为10 根据后台设定的map关系(redis或配置文件) ...
- JavaWeb核心编程之(三.2)Servlet配置
Servlet配置 1.配置Serlvet加载时机 2.配置多映射 配置加载时机 新建项目config->创建包com.xiaoan.config->创建类FirstServlet imp ...
- Cent OS 修改网卡配置
进入网卡修改界面 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 描述网卡设备名称 BOOTPROTO=static 静态IP,这里一 ...
- loading 动画效果(收藏起来以后留着慢慢用)
动画效果一: html代码: <div class="spinner"> <div class="rect1"></div&g ...
- js 获取月份 格式yy-mm-dd
/** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...
- Linux 安装xtrabackup的依赖问题
问题: 尝试安装xtrabackup rpm -ivh percona-xtrabackup-2.2.11-1.el7.x86_64.rpm 报错 perl(DBD::mysql) 被 percona ...
- delphi 基础书籍推荐
本文所推荐的书,我均仔细读过,受益良多. 1. Pascal 精要.下载Pascal精要 本书讲Pascal 语言基本知识. 2. Object Pascal 参考(中英文对照版).下载Object ...
- GDOI2015酱油记
GDOI2015酱油记 今年的GDOI在北江举行,比赛前一天坐了5小时的车才到,幸好忍住了,没有在车上吐. Day 1 刚到电教楼,看完考室后,第一时间找厕所,结果发现只有一楼有厕所,坑爹我的考室在三 ...
- ora-01031:insufficient privileges 解决方案
sqlplus /as sysdba 连补上,ora-01031的解决方法: (1)检查sqlnet.ora是否包含这句话:SQLNET.AUTHENTICATION_SERVICES=(NTS),没 ...