闲聊

      好久没写博客了,前几天小颖在朋友的博客里看到了用nodejs的简单爬虫。所以小颖就自己试着做了个爬博客园数据的demo。嘻嘻......
     小颖最近养了条泰日天,自从养了我家仔仔后,我觉得我走上一条不归路,每天不到七点半就起床烧热水,然后给我家仔仔烫狗粮,给仔仔烫好狗粮后,我开始收拾自己,出门前给他再把热水瓶里的热水换了,每天跟伺候小孩一样伺候着我家小不点仔仔,然而在上周天他还是生病了,拉稀.......带宠物医院好不容易看好,医生说是低血糖,我就懵逼了,低血糖就不能让他饿着,可是他压根就不好好吃饭,我有什么办法,哎......操碎了心,祈祷吧希望我家小仔仔能健健康康快快乐乐的长大嘻嘻。

看代码啦:

1.首先先安装node。

2.新建package.json:

在自己创建的一个工程目录下打开cmd ,在里面输入命令npm init

3.新建data和img文件夹

4.新建app.js

"use strict";

// 引入模块
var http = require('http');
var fs = require('fs');
var path = require('path');
var cheerio = require('cheerio'); // 爬虫的UR L信息
var opt = {
hostname: 'www.cnblogs.com',
path: '',
port: 80
}; // 创建http get请求
http.get(opt, function(res) {
var html = ''; // 保存抓取到的HTML源码
var blogs = []; // 保存解析HTML后的数据,即我们需要的电影信息 // 前面说过
// res 是 Class: http.IncomingMessage 的一个实例
// 而 http.IncomingMessage 实现了 stream.Readable 接口
// 所以 http.IncomingMessage 也有 stream.Readable 的事件和方法
// 比如 Event: 'data', Event: 'end', readable.setEncoding() 等 // 设置编码
res.setEncoding('utf-8'); // 抓取页面内容
res.on('data', function(chunk) {
html += chunk;
}); res.on('end', function() {
// 使用 cheerio 加载抓取到的HTML代码
// 然后就可以使用 jQuery 的方法了
// 比如获取某个class:$('.className')
// 这样就能获取所有这个class包含的内容
var $ = cheerio.load(html); // 解析页面
// 每篇文章都在 item class 中
$('#post_list .post_item .post_item_body').each(function() {
// 获取图片链接
var blog = {
title: $('.post_item_body .titlelnk', this).text(), // 获取文章标题
titleUrl: $('.post_item_body a', this).attr('href'), //文章链接地址
peopleUrl: $('.post_item_summary a', this).attr('href'), // 博客地址
peopleImg: $('.post_item_summary img', this).attr('src'),// 园友头像
intro: $('.post_item_summary', this).text(), // 获取文章简介
name: $('.post_item_foot .lightblue', this).text() // 获取文章简介
}; // 把所有文章放在一个数组里面
blogs.push(blog);
if (blog.peopleImg) {// 如果有图片则下载图片
downloadImg('img/', 'http:' + blog.peopleImg);
}
}); // 保存抓取到的文章数据
saveData('data/data.json', blogs);
});
}).on('error', function(err) {
console.log(err);
}); /**
* 保存数据到本地
*
* @param {string} path 保存数据的文件
* @param {array} blogs 文章信息数组
*/
function saveData(path, blogs) {
// 调用 fs.writeFile 方法保存数据到本地
fs.writeFile(path, JSON.stringify(blogs, null, 4), function(err) {
if (err) {
return console.log(err);
}
console.log('Data saved');
});
} /**
* 下载图片
*
* @param {string} imgDir 存放图片的文件夹
* @param {string} url 图片的URL地址
*/
function downloadImg(imgDir, url) {
http.get(url, function(res) {
var data = ''; res.setEncoding('binary'); res.on('data', function(chunk) {
data += chunk;
}); res.on('end', function() {
// 调用 fs.writeFile 方法保存图片到本地
fs.writeFile(imgDir + path.basename(url), data, 'binary',
function(err) {
if (err) {
return console.log(err);
}
console.log('Image downloaded: ', path.basename(url));
});
});
}).on('error', function(err) {
console.log(err);
});
}

5.打开cmd执行 node app.js

然后看data文件夹下会生成data.json文件,img文件夹下会生成许多图片。

补充

// 爬虫的UR L信息
var opt = {
hostname: 'www.cnblogs.com',
path: '',
port: 80
};

nodejs的简单爬虫的更多相关文章

  1. nodejs实现简单爬虫

    nodejs结合cheerio实现简单爬虫 let cheerio = require("cheerio"), fs = require("fs"), util ...

  2. 用nodejs实现简单爬虫

    前言   本喵最近工作中需要使用node,并也想晋升为全栈工程师,所以开始了node学习之旅,在学习过程中, 我会总结一些实用的例子,做成博文和视频教程,以实例形式来理解体会node的用法,所以跟小猫 ...

  3. NodeJS简单爬虫

    NodeJS简单爬虫 最近一直在追火星的一本书,然后每次都要去网站看,感觉很麻烦,于是,想起用爬虫爬取章节,务实派,说干就干! 爬取思路 1.该网站的页面呈现出一定的规律 2.使用NodeJS的req ...

  4. 一次使用NodeJS实现网页爬虫记

    前言 几个月之前,有同事找我要PHP CI框架写的OA系统.他跟我说,他需要学习PHP CI框架,我建议他学习大牛写的国产优秀框架QeePHP. 我上QeePHP官网,发现官方网站打不开了,GOOGL ...

  5. Python简单爬虫入门三

    我们继续研究BeautifulSoup分类打印输出 Python简单爬虫入门一 Python简单爬虫入门二 前两部主要讲述我们如何用BeautifulSoup怎去抓取网页信息以及获取相应的图片标题等信 ...

  6. [Java]使用HttpClient实现一个简单爬虫,抓取煎蛋妹子图

    第一篇文章,就从一个简单爬虫开始吧. 这只虫子的功能很简单,抓取到”煎蛋网xxoo”网页(http://jandan.net/ooxx/page-1537),解析出其中的妹子图,保存至本地. 先放结果 ...

  7. 简单爬虫,突破IP访问限制和复杂验证码,小总结

    简单爬虫,突破复杂验证码和IP访问限制 文章地址:http://www.cnblogs.com/likeli/p/4730709.html   好吧,看题目就知道我是要写一个爬虫,这个爬虫的目标网站有 ...

  8. Python简单爬虫入门二

    接着上一次爬虫我们继续研究BeautifulSoup Python简单爬虫入门一 上一次我们爬虫我们已经成功的爬下了网页的源代码,那么这一次我们将继续来写怎么抓去具体想要的元素 首先回顾以下我们Bea ...

  9. GJM : Python简单爬虫入门(二) [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

随机推荐

  1. Flex回声消除的最佳方法

    Adobe Flash Player 已经成为音频和视频播放的非常流行的工具.实际上,目前大多数因特网视频均使用 Flash Player观看. Flash Player 通过将许多技术进行组合可以提 ...

  2. Spring生命周期各种接口使用

    1,BeanPostProcessor接口:不能在POJO上面使用,需要单独找一个类进行使用:如果在POJO上面实现了此接口,在实现了其他*Aware接口之后,这个接口方法将不会被调用:2, POJO ...

  3. 我的小工具开源一下-PingTest

    v博客前言 先交代下背景,最近我们项目组的网络真是太渣了,时常remote不了另外一个地方的机器,过个几分钟就断开连接,太烦躁了,严重影响工作心情...于是想着做个工具记录下每天的断开remote连接 ...

  4. Android SVG矢量资源的使用方法

    VectorDrawable 与 SVG Android 5.0(Lollipop, API 21)后,新增了<vector>标签,以VectorDrawable的形式支持SVG类型矢量图 ...

  5. 最近总当机,IT帮网站用了1天时间成功搬家

    Posted on 2017年1月22日 最近一两周,IT帮的会员.BA学员和AM学员时不时反馈网站打不开.敏捷个人APP登录不了,有时候又可以但是很慢,还有的时候电信能访问而联通网络访问不了. 这个 ...

  6. Python实现字典的key和values的交换

    #encoding=utf-8 #反转字典 即key和val互换 dict1={1:2,3:4,6:7,9:10} print '---生成器表达式' def invert_dict(d): retu ...

  7. 【开源.NET】 分享一个前后端分离的轻量级内容管理框架

    开发框架要考虑的面太多了:安全.稳定.性能.效率.扩展.整洁,还要经得起实践的考验,从零开发一个可用的框架,是很耗时费神的工作.网上很多开源的框架,为何还要自己开发?我是基于以下两点: 没找到合适的: ...

  8. python之简单主机批量管理工具

    今天做了一个很简单的小项目,感受到paramiko模块的强大. 一.需求 二.简单需求分析及流程图 需求很少,我就简单地说下: 1. 主机分组可以配置文件实现(我用字典存数据的). 2. 登陆功能不做 ...

  9. 编写JQuery插件-3

    该了解我们也知道的差不多了,接下来编写我们第一个jq插件吧 封装对象方法的插件 我们编写一个设置和获取颜色的插件,我们需要实现两个功能 1.设置匹配元素的颜色 2.获取匹配元素(元素集合的第一个)的颜 ...

  10. Win10+Ubuntu16.04双系统安装

    硬件工具: 一台PC 一个U盘(8GB以上) Win10安装(已经装好Win10的小朋友们请无视): 准备工作: 下载Win10升级助手 保证系统盘有8GB以上剩余空间 安装步骤(由于安装过程中未记录 ...