node.js实现博客小爬虫的实例代码


Posted in Javascript onOctober 08, 2016

前言

爬虫,是一种自动获取网页内容的程序。是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上就是针对爬虫而做出的优化。

这篇文章介绍的是利用node.js实现博客小爬虫,核心的注释我都标注好了,可以自行理解,只需修改url和按照要趴的博客内部dom构造改一下filterchapters和filterchapters1就行了!

下面话不多说,直接来看实例代码

var http=require('http');
var Promise=require('Bluebird');
var cheerio = require('cheerio');
var url='http://www.immaster.cn';//博客地址
function filterchapters1(html) {//解析文章链接
 var $ =cheerio.load(html);
 var post=$('.post');
 
 var content=[];
 post.each(function (item) {
 
 var postid=$(this).find('.tit').find('a').attr('href');
 
 content.push(postid);
 })
 return content;
}
function filterchapters(html) {//解析每个文章内的内容
 var $ =cheerio.load(html);
 var tit=$('.post .tit').find('a').text();
 var postid=$('.tit').find('a').attr('href');
 var commentnum=$('.comments-title').text();
 commentnum=commentnum.trim();
 // commentnum=commentnum.replace('\n','');
 var content={tit:tit,url:postid,commentnum:commentnum};
 return content;
}
function getid(url){//爬取首页文章链接
 return new Promise(function (resolve,reject) {
 http.get(url,function (res) {
 var html = '';
 res.on('data',function(data) {
 html+=data;
 });
 res.on('end',function () {
 var content=filterchapters1(html)
 resolve(content);
 
 })
}).on('error',function () {
 reject(e);
 console.log('抓取出错!')
 })
})
}
function getpageAsync(url) {//爬取单个页面内容
 return new Promise(function (resolve,reject) {
 console.log('正在爬取……'+url)
 http.get(url,function (res) {
 var html = '';
 res.on('data',function(data) {
 html+=data;
 });
 res.on('end',function () {
 resolve(html);
 
 })
 }).on('error',function () {
 reject(e);
 console.log('抓取出错!')
 })
 })
}
getid(url)
 .then(function(postid){
 return new Promise(function (resolve,reject) {
 var pageurls=[];
 postid.forEach(function (id) {
 pageurls.push(getpageAsync(id));
 })
 resolve(pageurls);
 })
 })
 .then(function(pageurls){
 return new Promise.all(pageurls);//让promise对象同时开始运行
 })
 .then(function (pages) {
 var coursesData=[];
 pages.forEach(function (html) {
 var courses=filterchapters(html);
 coursesData.push(courses);
 })
coursesData.forEach(function(v){
 console.log('标题:'+v.tit+"\n地址:"+v.url+"\n评论:"+v.commentnum)
 })
 })

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用node.js实现爬虫能有所帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
JavaScript 仿关机效果的图片层
Dec 26 Javascript
js以对象为索引的关联数组
Jul 04 Javascript
JavaScript Date对象 日期获取函数
Dec 19 Javascript
最佳JS代码编写的14条技巧
Jan 09 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
Nov 19 Javascript
JS实现局部选择打印和局部不选择打印
Apr 03 Javascript
javascript如何判断输入的url是否正确
Apr 11 Javascript
详解javascript实现瀑布流绝对式布局
Jan 29 Javascript
ES6扩展运算符的用途实例详解
Aug 20 Javascript
解决vue-router进行build无法正常显示路由页面的问题
Mar 06 Javascript
详解JavaScript中操作符和表达式
Sep 12 Javascript
vue项目中定义全局变量、函数的几种方法
Nov 08 Javascript
阿里云ecs服务器中安装部署node.js的步骤
Oct 08 #Javascript
JavaScript“尽快失败”的原则实例详解
Oct 08 #Javascript
jQuery如何解决IE输入框不能输入的问题
Oct 08 #Javascript
微信小程序 canvas API详解及实例代码
Oct 08 #Javascript
微信小程序 animation API详解及实例代码
Oct 08 #Javascript
AngularJS实践之使用NgModelController进行数据绑定
Oct 08 #Javascript
Bootstrap Navbar Component实现响应式导航
Oct 08 #Javascript
You might like
PHP中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
2016/04/27 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
Javascript算符的优先级介绍
2013/03/20 Javascript
处理及遍历XML文档DOM元素属性及方法整理
2013/08/23 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
2015/09/15 Javascript
Javascript 实现计算器时间功能详解及实例(二)
2017/01/08 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
原生JS和jQuery操作DOM对比总结
2017/01/19 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
vue实现购物车的监听
2020/04/20 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
Vue实现跑马灯效果
2020/05/25 Javascript
Python如何判断数独是否合法
2016/09/08 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
scrapy-redis的安装部署步骤讲解
2019/02/27 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
2019/05/09 Python
使用python写的opencv实时监测和解析二维码和条形码
2019/08/14 Python
在vscode中配置python环境过程解析
2019/09/28 Python
Python加密模块的hashlib,hmac模块使用解析
2020/01/02 Python
python程序需要编译吗
2020/06/19 Python
Python 2.6.6升级到Python2.7.15的详细步骤
2020/12/14 Python
CSS3实现线性渐变用法示例代码详解
2020/08/07 HTML / CSS
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
妇产科护士自我鉴定
2013/10/15 职场文书
职工运动会邀请函
2014/02/02 职场文书
建房协议书
2014/04/11 职场文书
python实现批量移动文件
2021/04/05 Python
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL
Python机器学习之基础概述
2021/05/19 Python
使用Redis实现分布式锁的方法
2022/06/16 Redis