1.实验目的
使用Node.js实现一个简单的爬虫。
2.实验方法
通过request模块获取HTML页面,然后通过cheerio模块解析HTML页面获取图片的src地址,最后再次通过request模块获取图片并将其保存到文件夹中。
3.实验环境
windows10操作系统
node.js v8.9.4版本
4.实验步骤
4.1. 环境安装
npm install request
npm install cheerio
npm install iconv-lite
4.2. 获取HTML页面
const request = require("request");
const url = "http://www.netbian.com/desk/21245.htm";
request(url, function(error, response, body) {
if(!error && response) {
console.log(body);
}
});
可以看到,爬取结果中出现了中文乱码的问题,所以需要对其进行转码。
这里我们使用iconv-lite模块来解决这个问题。
const request = require("request");
const iconv = require("iconv-lite");
const url = "http://www.netbian.com/desk/21245.htm";
request({url: url, encoding: null}, function(err, res, body) {
if(!err && res) {
let newBody = iconv.decode(body, "gb2312"); //转成gb2312编码
console.log(newBody);
}
});
4.3. 分析DOM模型获取图片的src地址
由图三分析,我们采用
$("div[class= pic] img")
来选定图片。
const request = require("request");
const iconv = require("iconv-lite");
const cheerio = require("cheerio");
const url = "http://www.netbian.com/desk/21245.htm";
request({url: url, encoding: null}, function(err, res, body) {
if(!err && res) {
let newBody = iconv.decode(body, "gb2312");
let $ = cheerio.load(newBody); //选定分析的DOM模型
console.log($("div[class= pic] img").attr("src")); //获取图片的src地址
}
});
4.4. 将图片保存在文件夹中
最后,我们通过path模块设置路径并通过fs模块将图片保存到文件夹中。
const request = require("request");
const iconv = require("iconv-lite");
const cheerio = require("cheerio");
const path = require("path");
const fs = require("fs");
const url = "http://www.netbian.com/desk/21245.htm";
request({url: url, encoding: null}, function(err, res, body) {
if(!err && res) {
let newBody = iconv.decode(body, "gb2312");
let $ = cheerio.load(newBody);
let src = $("div[class= pic] img").attr("src");
let suffix = src.split('.').pop(); //获取图片的后缀名
//路径为当前文件夹下的girl.后缀文件
let position = path.join(__dirname, "girl" + "." + suffix);
request(src).pipe(fs.createWriteStream(position)); //将图片写入文件夹中
}
});
5 .参考文献
- request模块:https://www.npmjs.com/package/request
- 中文乱码解决方案:https://www.cnblogs.com/ilovewindy/p/6023603.html
- iconv-lite模块:https://www.npmjs.com/package/iconv-lite
- cheerio模块:https://www.npmjs.com/package/cheerio