这篇文章的代码在我之前写的node.js爬虫——爬取优快云首页的文章内容的基础上进行修改,做针对图片的爬取,实际上就是读取图片的资源,将图片保存到本地
首先将之前的代码复制过来,将读取文章的部分删除
const https = require("https")
const cheerio = require("cheerio")
const fs = require("fs")
const url = "https://www.youkuaiyun.com/";
httpGet(url, function($) {
})
// 封装方法
function httpGet(url, callback) {
https.get(url, res => {
let data = "";
res.on("data", (chunk) => {
data += chunk;
})
res.on("end", () => {
let $ = cheerio.load(data);
callback($)
})
}).on("error", (err) => {
console.log(err.message);
})
}
这里我们要获取图片,获取所有img标签,并取得其src属性,即图片对应的路径
$('img').each(function() {
let srcUrl = $(this).attr('src');
console.log('srcUrl: ', srcUrl);
})
我们可以看到,图片的路径已经被打印出来了,但是存在一些问题,有的图片是在当前网址即首页下的路径的图片
还有一些图片是没有后缀名
甚至有的是undefined,在爬取图片时,我们要对这些图片进行处理
httpGet(url, function($) {
$('img').each(function() {
let srcUrl = $(this).attr('src');
// 如果路径不为undefiend且图片前5个字母不为https
if (srcUrl != undefined) {
if (srcUrl.slice(0, 5) !== 'https') {
// 拼接上首页的网址
srcUrl = url + srcUrl;
}
console.log(srcUrl);
}
})
})
到这里图片的格式就处理完毕了,接下来我们将图片下载并保存到本地,封装一个download方法来完成。
function download(url, dir, filename) {
//得到扩展名
var extname = path.extname(url);
if (extname === '.jpg' || extname === '.png' || extname === 'gif' || extname === 'svg') {
console.log('url: ', url);
request.head(url, function(err, res, body) {
request(url).pipe(fs.createWriteStream(dir + "/" + filename));
});
}
}
导入request模块来请求图片资源,导入path模块来判断图片的格式,然后调用方法,将其放到当前根目录的img文件夹中,注意要先创建文件夹,否则会报错。
httpGet(url, function($) {
$('img').each(function() {
let srcUrl = $(this).attr('src');
// 如果路径不为undefiend且图片前5个字母不为https
if (srcUrl != undefined) {
if (srcUrl.slice(0, 5) !== 'https') {
// 拼接上首页的网址
srcUrl = url + srcUrl;
}
// 使用时间来命名,保证图片文件名不同
download(srcUrl, './img', new Date().getTime() + path.extname(srcUrl));
}
})
})
完整代码
const https = require("https")
const cheerio = require("cheerio")
const fs = require("fs")
const request = require("request")
const path = require("path")
const url = "https://www.youkuaiyun.com/";
httpGet(url, function($) {
$('img').each(function() {
let srcUrl = $(this).attr('src');
// 如果路径不为undefiend且图片前5个字母不为https
if (srcUrl != undefined) {
if (srcUrl.slice(0, 5) !== 'https') {
// 拼接上首页的网址
srcUrl = url + srcUrl;
}
let extnameArr = ['.png', '.jpg', '.gif', '.svg'];
srcUrl = adjustFormat(srcUrl, extnameArr);
// 使用时间来命名,保证图片文件名不同
download(srcUrl, './img', new Date().getTime() + path.extname(srcUrl));
}
})
})
// 封装请求方法
function httpGet(url, callback) {
https.get(url, res => {
let data = "";
res.on("data", (chunk) => {
data += chunk;
})
res.on("end", () => {
let $ = cheerio.load(data);
callback($)
})
}).on("error", (err) => {
console.log(err.message);
})
}
// 封装下载方法
function download(url, dir, filename) {
//得到扩展名
var extname = path.extname(url);
if (extname === '.jpg' || extname === '.png' || extname === 'gif' || extname === 'svg') {
console.log('url: ', url);
request.head(url, function(err, res, body) {
request(url).pipe(fs.createWriteStream(dir + "/" + filename));
});
}
}