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来写这个爬虫 ...
随机推荐
- Tomcat7配置数据源(Oracle)
修改../conf/content.xml <?xml version='1.0' encoding='utf-8'?> <!-- The contents of this file ...
- CSS display属性的值及作用
display 的属性值有:none|inline|block|inline-block|list-item|run-in|table|inline-table|table-row-group|tab ...
- hdu 4681 string
字符串DP 题意:给你三个字符串a,b,c求字符串d的长度. 字符串d满足的要求:是a和b的公共子序列,c是它的子串. 定义dp1[i][j]表示a的第 i 位与b的第 j 位之前相同的子序列长度(包 ...
- light oj 1027 A Dangerous Maze
一道数学期望题,唉唉,概率论学的不好啊~~ 求走出迷宫的期望时间. 由于有的门会回到起点,所以有可能会走很多遍,设能走出去的门的个数为n1,总的个数为n,那么一次走出去的概率为n1/n,走一次的用的平 ...
- boost signal2 slot_base
先看成员_tracked_objects,从字面上讲是被跟踪的对象,再看,相关函数 bool expired() const,这个函数是检查_tracked_objects是否已经expired.只不 ...
- JVM学习之JVM1.6 GC详解
转自:http://www.cnblogs.com/ggjucheng/p/3977384.html,多谢分享 前言 JVM GC是JVM的内存回收算法,调整JVM GC(Garbage Colle ...
- Asp.net MVC学习--默认程序结构、工作流程
二.MVC 默认程序结构 MVC新建好之后,会对应的出现几个包,分别是:Controller.Model.View --即MVC 其中的默认的Default.aspx文件可以方便url重写,如果不设置 ...
- 不能取组织ID
应用 Oracle Purchasing 层 Level Function 函数名 Funcgtion Name PO_POXBWVRP 表单名 Form Name POXBWVRP 说明 Des ...
- sketch 跟随鼠标指针移动的特效
演示地址:http://www.ke01.com/yanshi/sucai/20140830/2/ 下载地址:https://yunpan.cn/cqgWeIYPer8eC 访问密码 672b
- spring的作用及优势---第一个spring示例
Spring 的作用及优势 * Spring 用于整合,好处是解耦. 解耦,可以降低组件不组件乊间的关联,改善程序结构,便于系统的维护和扩展. 我们在使用 Spring 框架时,主要是使用 Spri ...