最近刚开始接触node,发现node爬虫很有意思。于是便想着尝试去爬某网站的所有图片,一举成功了,记录下过程。
const http = require('http')
const cheerio = require('cheerio') //node版的jq
const path = require('path')
var fs = require('fs')
首先引入会用到的模块,然后封装一个爬取页面的方法
function getPac (url) {
http.get(url, function (res) {
var data = ''
res.on('data', (chunk) => {
data += chunk
})
res.on('end', () => {
filter(data)
})
})
}
对页面数据进行处理,筛选出自己想要爬取的数据。
function filter (data) {
var result = []
// console.log('data', data)
var $ = cheerio.load(data)
let temp_arr = $('#index-flex-images').find('.lazy') //根据情况自定义
temp_arr.each(function (index, item) {
// result.push($(item).attr('href'))
return result.push($(item).attr('data-original'))
})
// console.log(result)
result.map((item, index) => {
let extname = path.extname(item)
if (extname) {
// console.log(item)
let name = path.basename(item)
downImg(item, name)
} else {
downImg(item, index + '.jpg')
}
})
}
封装一个下载图片的方法
function downImg (url, name) { //将图片下载到指定路径
if (!fs.existsSync('./lesson/')) {
fs.mkdir('./lesson/')
}
var req = http.get(url, function (res) {
var imgData = ''
res.setEncoding('binary') // 一定要设置response的编码为binary否则会下载下来的图片打不开
res.on('data', function (chunk) {
imgData += chunk
})
res.on('end', function () {
fs.writeFile('./lesson/img/' + name, imgData, 'binary', function (err) {
if (err) {
console.log('保存失败')
}
console.log('保存成功')
})
})
res.on('error', function (err) {
console.log('请求失败', err)
})
})
req.on('error', function (err) {
console.log('请求失败2' + err.message)
})
}
选择想爬取的页面,调用方法即可
var url = 'http://588ku.com/beijing/0-0-pxnum-0-8-0-0-0-1/?h=bd&sem=1'
getPac(url)