开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
之前学习了Node.js的基本知识, 但是由于近期在做一个微信小程序,有差不多一个月没有持续学习了,今天来简单实现一个爬虫小案例,复习巩固一下相关知识点。
1. 创建顶级目录,初始化项目
npm init
2. 安装所需的依赖(模块)
npm install express request cheerio --save
express 用于搭建node服务
request 封装了 http 模块,让请求更加简洁
cheerio 主要用于服务器端对DOM进行操作(简单的理解为用来解析html代码)
request的参数说明:
- url: 请求的地址
- method: 请求的方式
- function: 回调函数,该函数三个参数:
err 错误对象
response 响应对象
body 响应数据
3. 创建入口文件app.js
基本框架
var express = require('express');
var app = express();
app.get('/', function (req, res) {
// your code here
});
app.listen(3000, function (req, res) {
console.log('app is running at port 3000');
});
爬虫的思路可以总结为:请求url - > html(信息) -> 解析html
爬取流程:
a. 找寻目标, 选取网页url
此案例实现爬取一些图书信息,这里选用了豆瓣读书TOP250的链接地址,通过request拿到网页的所有数据。
b. 爬虫需要抓取页面上特定的信息,依据一些标识符(如:id,class)去拿到想要的信息。打开选取网页的控制台,查看相关信息存放和元素的标识符(id,class,element)。
c. 使用cheerio工具解析需要的内容,爬取标题、介绍、图片等信息进行存放。
d. 把爬取到的数据写入到创建的books.json文件中。
const express = require("express");
const app = express();
const request = require("request");
const cheerio = require("cheerio");
const fs = require("fs");
app.get("/", function (req, res) {
//插入响应代码,包括启动爬虫,结果信息输出等
request("https://book.douban.com/top250", function (error, response, body) {
if (!error && response.statusCode == 200) {
const $ = cheerio.load(body);
let allBooks = [];
$("table .item").each(function () {
// 循环时this指向当前这本书,相当于this.querySelector
const title = $(".pl2 a", this).attr("title");
const quote = $(".quote .inq", this).text();
const pic = $(".nbg img", this).attr("src");
allBooks.push({
title,
quote,
pic,
});
});
res.send(allBooks);
// 存数据库,没有数据库把数组写入json文件中 fs
fs.writeFile("./books.json", JSON.stringify(allBooks), function (err) {
if (!err) {
console.log("文件写入完毕");
}
});
}
});
});
app.listen(3000, function () {
console.log(`服务器运行在 http://localhost:3000/`);
});
4. 在终端执行node app命令,运行app.js文件,
点击服务器运行的网址,就可以得到爬取成功的图书数据。(ps: 可以在网页中查看数据,也可以在books.json文件中查看数据)