天天看点

node爬虫_爬取斗图啦网站上的表情包

最近在学习node.js,做点不是人的事情:爬取网站上的表情包

实现步骤:

1、分析网站的结构:

斗图啦这个网站是服务器渲染的,直接打开网站就可以获取到完整的html信息。

我们可以看到下面两张图就是我们需要获取的信息

node爬虫_爬取斗图啦网站上的表情包
node爬虫_爬取斗图啦网站上的表情包

2、使用的插件工具

(1)axios ====> 异步获取ajax请求

(2)cheerio ====> cheerio是jquery核心功能的一个快速灵活而又简洁的实现,主要是为了用在服务器端需要对DOM进行操作的地方(简单点说就是方便操作获取回来的html数据)

3、网站数据分析

(1)第一步需要爬取的数据

node爬虫_爬取斗图啦网站上的表情包

(2)第二步要爬取的数据

node爬虫_爬取斗图啦网站上的表情包

4、代码实现:

// 安装好我们需要的插件工具 可以换成cnpm淘宝镜像
npm install axios --save
npm install cheerio --save
           
// index.js

let axios = require('axios');
let cheerio = require('cheerio')
const fs = require('fs')
const path = require('path')

// 需要爬取的网站地址:斗图啦
let httpUrl = 'https://www.doutula.com/article/list/?page=1'

axios.get(httpUrl).then(function(res) {
	// 获取回来后,res.data就是网站的html格式数据
	// 初始化$
	let $ = cheerio.load(res.data)
	// 整理第一步需要爬取的数据
	$('#home .col-sm-9>a').each((i,el) => {
		// 获取a标签里面的url,等待下一步进入详情页面爬取第二步数据
		let pageUrl = $(el).attr('herf)
		
		// 获取a标签里面的title,方便创建目录
		let title = $(el).find('.random_title').text()
		
		// .random_title里面有一个div的标签,需要去掉才能获取到真实的名字
		// 利用reg正则表达式exec
		let reg = /(.*?)\d/igs
		title = reg.exec(title)[1]
		
		//根据title 创建文件目录 
		fs.mkdir('./img/' + title, function(err) {
			if(err){
			
			} else {
				console.log('成功创建目录:','./img/' + title)
			}
		})
		
		// 爬取第二步数据,下载图片
		parsePage(pageUrl,title)
	})
}).catch(function (err) {
	console.log(err)
})

// 爬取第二步数据,下载图片 函数
async function parsePage(url,title) {
	// 异步获取 传进来的url地址中的数据
	let res = await axios.get(url)
	
	// cheerio 初始化 res.data数据
	let $ = cheerio.load(res.data)
	
	$('.pic-content img').each((i,el) => {
		// 获取表情包url地址
		let imgUrl = $(el).attr('src)
		
		//解析图片扩展名
		extName = path.extname(imgUrl)
		
		// 图片写入的路径和名字
		let imgPath = `./img/${title}/${title}-${i}${extName}`
		// 创建写入流
		let ws = fs.createWriteStream(imgPath)
		
		// 下载表情包图片
		axios.get(imgUrl, { responseType: 'stream' }).then(function(res) {
			// 获取到的图片二进制信息写入本地文件中
			res.data.pipe(ws)
			
			// 写入完成后关闭写入流
			res.data.on('close', function () {
				ws.close()
			})
		})
	})
}

           

最后附上gitee的源码 https://gitee.com/Vansooo/reptiles-get-emoticon-pack/tree/master

小小的作品,希望对大家有帮助,也希望各位大佬可以指点指点

js