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来写这个爬虫 ...
随机推荐
- poj3122--二分加贪心
大致题意: 就是公平地分披萨pie 我生日,买了n个pie,找来f个朋友,那么总人数共f+1人 每个pie都是高为1的圆柱体,输入这n个pie的每一个尺寸(半径),如果要公平地把pie分给每一个人(就 ...
- cmd正常启动tomcat,而 从eclipse启动出现 404
设置Tomcat的路径,启动Tomcat,先测试一下环境,在浏览器中输入http://127.0.0.1:8080/ 提示 404找不到网页.出现这种问题然后试了一下,tomcat在外面直接启动 然 ...
- (跨平台)cocos2d-x C++ or Object-C(前端)调用C# webservices(后台),实现交叉编译到Android/IOS/WinPhone等移动终端设备
1.2014年4月2号算是正式找到自己的实习工作-杭州美迪软件有限公司(移动物联事业部)合作于:四川管家婆总部移动终端代理,由于在校选编程专业语言C#和在浙大网新培训课程(C#.Asp.net开发)缘 ...
- python相似模块用例(一)
一:threading VS Thread 众所周知,python是支持多线程的,而且是native的线程,其中threading是对Thread模块做了包装,可以更加方面的被使用,threading ...
- eclipse 快捷方式大全
Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当 ...
- android开源框架和开源项目(转)
特效: http://www.androidviews.net/ http://www.theultimateandroidlibrary.com/ 常用效果: 1. https://github.c ...
- Protection 5 ---- Priviliege Level Checking 2
CPU不仅仅在程序访问数据段和堆栈段的时候进行权限级别检查,当程序控制权转换的时候也会进行权限级别检查.程序控制权转换的情况很多,各种情况下检查的方式以及涉及到的检查项都是不同的.这篇文章主要描述了各 ...
- 跟我一起学ruby (转)
跟我一起学ruby By Tiger 注:本教程转载自在游戏先行者论坛,版权属于作者Tiger. 第一篇 第二篇 第一篇 自序 从今天起我就要开始学Ruby了.怎么样,没见吧?一个新人写教程.就凭我坚 ...
- poj2000---和1969一样的模板
#include <stdio.h> #include <stdlib.h> int main() { int d; while(scanf("%d",&a ...
- Ubuntu adb devices 出现??? no permissions 的解决方法
在ubuntu 12.10下运行adb devices出现: List of devices attached ???????????? no permissions 1.用命令: lsusb 以 ...