简介

这是我第一次尝试爬虫,也是第一次使用node.js爬虫,有啥不正确的望各位大佬多多指教。

本实验是基于nodejs中,使用cheerio模块实现简单爬取网站所需信息,因为在次实例中(本次实例的网址)需要做到写入文件以及启动我们自己的服务(可能不用)和创建http请求,所以还需要用到另外三个模块,fs、express以及axios

模块安装

1
2
3
4
npm init -y #跳过向导,快速生成package.json说明书文件
npm i --save axios
npm i --save express
npm i --save cheerio

axios简介

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中

axios文档

cheerio简介

Fast, flexible & lean implementation of core jQuery designed specifically for the server.

官网文档

express简介

基于 Node.js 平台,快速、开放、极简的 Web 开发框架

express中文网

模块引入

在这里其实有个小插曲,一开始是想用request模块去请求目标网址,可是不知道出现何种原因,请求不了(用这个模块尝试其它网址是可以的),所以更换成了axios模块

1
2
3
4
5
6
const express = require('express')
const cheerio = require('cheerio')
const axios = require('axios')
const fs = require('fs')

const app = express()

使用

axios自带promise的使用方法,在get我们需要爬取的网址后,通过cheerio的load方法获取该页面的html结构,我们可以使用$来接收这个变量(官网就是这样写的),然后就可以用类似JQuery的方法去操作里面的元素了,这里我们需要每个学校的学校名,邮编以及联系方式,所以我们可以打开f12查看这些标签的信息,通过唯一的id名或者类名,我们就可以对该节点的子节点元素进行遍历,然后将数据存入我们准备好的txt或者其他文本文件里,之后再做进一步筛选和处理

image-20200806104010310

因为数据分好几页,所以在这里我首先去获取到该页面总共的页数,之后定义了一个for循环,去循环遍历每一页,再对每一页的内容进行爬取

以下为主要的爬取代码

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
axios.get('https://www.ruyile.com/xuexiao/?a=3120')
.then((response) => {
let $ = cheerio.load(response.data)
let a = $('.zys').text() //获取总页数
return a
})
.then(a => {
//遍历每一页
for (let i = 1; i <= a; i++) {
axios.get('https://www.ruyile.com/xuexiao/?a=3120&p=' + i)
.then((res) => {
let school = []
let $ = cheerio.load(res.data) //获取当前页的html内容
$('.xxlb div h4').each((i, ele) => {
school.push($(ele).text()) //遍历每个h4标签后存入预先定义好的数组中
})
return school
})
.then((school) => {
//将每一次遍历得到的数组存入txt文件里
fs.appendFile('a.txt', '\n' + school + '\n', 'utf8', (err) => {
if (err) {
console.log('err')
}
})
})
}
})

其它标签的内容使用同样的原理进行爬取

总结

总觉得这次写的代码有哪些欠缺(运行起来是没有问题的),或者美观度,易读性不太好,遇到的困难就是在request模块下请求不到该网址,最后想不出什么解决方法,所以也更换了模块,就当是第一次爬虫的锻炼吧(好长的路要走),也是第一次尝试用nodejs进行爬虫。