很多时候自己做前端项目由于没有后台和数据的支持,往往无法更好的渲染页面效果,这时候爬虫就可以很好地解决这个烦恼,本站点的所有爬虫文章都基于豆瓣页面。

node爬虫程序依赖两个npm包:superagent、cheerio,和nodejs的fs模块,通过分析页面DOM结构,提取相应的数据写入json文件中。

本程序依赖node.js和上面的两个npm,请自行创建node项目并安装,可以使用webstorm直接创建一个node.js express App

1.引入依赖模块

1
2
3
4
5
6
7
8
//导入包
const http = require("http");
const path = require("path");
const url = require("url");
const fs = require("fs");

const superagent = require("superagent");
const cheerio = require("cheerio");

2.调用superagent的get方法和end方法处理

get(): 此方法参数为获取数据的链接
end(): 此方法第一的参数为error对象,第二个参数为get中页面的所有DOM结果

1
2
3
4
5
superagent
.get("https://book.douban.com/latest?icn=index-latestbook-all")
.end((error, response)=>{
// ......
})

3.分析结构,提取相应的数据

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
//获取页面文档数据
var content = response.text;
//cheerio也就是node下的jquery 将整个文档包装成一个集合,定义一个$接收
var $ = cheerio.load(content);
//定义一个空数组,用来接收数据
var result = [];
//分析文档结构 先获取每个li 再遍历里面的内容(此时每个li里面就存放着我们想要获取的数据)
$(".cover-col-4 li").each(function(index,value){
//提取url链接中的id
var address = $(value).find(".cover").attr("href");
var bookId = address.replace(/[^0-9]/ig,"");
var gradeStr = $(value).find(".detail-frame .rating .font-small").text().replace(/\ +/g,"").replace(/[\r\n]/g,"");
//将获取的数据以对象的形式添加到数组中
var oneBook = {
title: $(value).find(".detail-frame h2 a").text(),
bookId: bookId,
grade: Number(gradeStr) ? Number(gradeStr) : 0,
bookInfo: $(value).find(".detail-frame .color-gray").text().replace(/\ +/g,"").replace(/[\r\n]/g,""),
bookImg: $(value).find(".cover img").attr("src").replace(/^https:/g,""),
description: $(value).find(".detail-frame .detail").text().replace(/\ +/g,"").replace(/[\r\n]/g,"")
};
result.push(oneBook);
});

//将数组转成字符串
result = JSON.stringify(result);
//将数组输出到json文件里 刷新目录 即可看到当前文件夹多出一个newBooks.json文件
fs.writeFile("newBooks.json", result, "utf-8", (error)=>{

//监听错误,如正常输出,则打印null
if(error == null){
console.log("恭喜您,数据爬取成功!请打开json文件");
}
})

这里我是获取豆瓣书本数据,一本书包含:标题、书本ID、评分、书本信息、书本封面、简介。

完整代码请参考:https://github.com/joydezhong/SimpleCrawler/blob/master/crawler.js