http结合cheerio小爬虫(一)

最近刚开始学node.js,自己打算根据自己所学习的内容写成博客发布出来,一来可以作为学习总结,二来可以训练一下自己的文字表达能力。

今天在慕课网看了http的课程,跟着视频做出了一个小爬虫,抓取的是《进击node.js基础》这个网页,获取的是章节title和章节下面具体小节title,虽然很简单,不过还是觉得对我学习node、前端的知识以及http协议有很大的帮助。

抓取网页用到的技术是cheerio,它是nodejs的抓取页面模块。适用于各种web爬虫程序。

想要用这个模块,肯定要先安装上它,方法是在你当前文件路径安装:

npm install cheerio

在js文件内容需要引入它

1
var cheerio = require('cheerio')

加载的方式如下,html是我定义的变量,可以换成自己所定义的信息

1
var $ = cheerio.load(html)

下面贴出具体代码,与原课程有改动。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/**
* Created by wangyongzhi on 16/8/7.
*/
//加载http模块,它的职责是负责创建web服务器,处理http相关的任务等等
var http = require('http')
//加载抓取网页模块cheerio
var cheerio = require('cheerio')
//所要抓取的网页
var url = 'http://www.imooc.com/learn/348'
//过滤网页信息得到所需的章节信息
function filterChapters(html) {
var $ = cheerio.load(html)
var chapters = $('.chapter')
var courseData = []
chapters.each(function (item) {
var chapter = $(this)
var chapterTitle = chapter.find('strong').text()
var videos = chapter.find('.video').children('li')
var chapterData = {
chapterTitle : chapterTitle,
videos : []
}
videos.each(function (item) {
var video = $(this).find('.studyvideo')
var videoTitle = video.text()
var id = video.attr('href').split('video/')[1]
chapterData.videos.push({
title : videoTitle,
id : id
})
})
courseData.push(chapterData)
})
return courseData
}
//打印所有章节的内容
function printCourseInfo(courseData) {
courseData.forEach(function (item) {
var chapterTitle = item.chapterTitle
console.log(chapterTitle+'\n')
item.videos.forEach(function (video) {
console.log(' 【' + video.id + '】 ' + video.title )
})
})
}
http.get(url,function (res) {
var html = ''
res.on('data',function (data) {
html += data;
})
res.on('end',function () {
var courseData = filterChapters(html)
printCourseInfo(courseData)
})
}).on('error',function () {
console.log('Get the course information error!')
})

抓取的结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
第1章 前言
【6687】 1-1 前言 (01:20)
【6688】 1-2 为什么学习Nodejs (05:43)
第2章 安装 Nodejs
【6689】 2-1 课程简介 (01:19)
【6690】 2-2 Nodejs版本常识 (01:02)
【6691】 2-3 Windows下安装Nodejs (04:43)
【6692】 2-4 Linux下安装Nodejs (06:24)
【6693】 2-5 Mac下安装Nodejs (03:55)
第3章 等不及了来尝鲜
【6694】 3-1 起一个web服务器 (05:14)
【6695】 3-2 命令行中体验 (02:47)
第4章 模块与包管理工具
【6697】 4-1 Node.js 的模块 与 Commonjs 规范 (03:44)
【6700】 4-2 模块的分类 (00:45)
【6701】 4-3 简单的Nodejs模块 (09:23)
第5章 横扫 Nodejs API
【6705】 5-1 不要陷入版本选择的深渊 (02:32)
【6710】 5-2 URL网址解析的好帮手 (10:30)
【6711】 5-3 QueryString参数处理小利器 (06:40)
【6712】 5-4 HTTP知识先填坑 (09:43)
【6713】 5-5 HTTP知识填坑之“以慕课网为例分析” (10:13)
【7557】 5-6 HTTP 事件回调进阶 (17:51)
【7558】 5-7 HTTP 源码解读之先了解作用域、上下文 (20:50)
【7963】 5-8 HTTP 源码解读 (22:08)
【7964】 5-9 HTTP 性能测试 (09:15)
【7965】 5-10 HTTP 小爬虫 (17:33)
【8525】 5-11 事件模块小插曲 (15:15)
【8837】 5-12 request方法 (17:56)