Node爬虫(一):使用正则表达式爬取图片

编写爬虫爬取www.itsource.cn首页中的图片

原理

发起请求

发起请求
读取首页HTML
提取所有图片地址
向图片地址发起请求
获取图片数据
保存图片

使用https模块发起请求,获取响应的数据

var https = require('https')

//1、使用https模块发起请求,获取响应的数据

https.get('https://www.itsource.cn/', function(res) {
	var content = ''
	//通过响应对象的data事件,得到HTML数据
	res.on('data', function(str) {
		content += str
	})

	//绑定结束事件,当数据读取完后执行该事件
	res.on('end', function() {
		console.log(content)
	})
})

注:是使用http模块还是https模块根据网址来选择,否则可能会不成功

在这里插入图片描述
分析html数据提取所有的图片地址

  • 查看网页源代码,分析图片数据
  • 编写正则表达式
//绑定结束事件,当数据读取完后执行该事件
res.on('end', function() {
	//关于图片的正则
	var img_reg = /src="(.*?\.png)"/img
	var data = img_reg.exec(content)
	fs.writeFile('./test.txt', data, function() {
		console.log("写入成功")
	})
})

结果

src="/themes/simplebootx/img/index/header_ad.png",/themes/simplebootx/img/index/header_ad.png

exec函数返回的结果是一个数组,我们只需要数组的第二项即可,然后通过循环获取所有的图片地址

res.on('end', function() {
		//关于图片的正则
		var img_reg = /src="(.*?\.jpg)"/img
		var filename
		while(filename = img_reg.exec(content)){
			console.log(filename[1])
		}
	})

在这里插入图片描述
编写函数将图片保存的本地

//获取图片
function getImage(url) {
	//path模块用于解析文件路径
	var obj = path.parse(url)
	//文件名
	var img_name = obj.base
	//创建文件写入流
	var stream = fs.createWriteStream('./file/' + img_name)
	//兼容网址里面没有根目录的
	if (obj.root.length === 0) {
		url = '/' + url
	}
	//拼接完整的图片url,进行图片的下载
	url = 'https://www.itsource.cn' + url //cn后不要再加/防止冲突
	https.get(url, function(res) {
		//使用管道保存图片
		res.pipe(stream)
	})
}

完整代码

var https = require('https')
var fs = require('fs')
var path = require('path')

//1、使用https模块发起请求,获取响应的数据

https.get('https://www.itsource.cn/', function(res) {
	var content = ''
	//通过响应对象的data事件,得到HTML数据
	res.on('data', function(str) {
		content += str
	})

	//绑定结束事件,当数据读取完后执行该事件
	res.on('end', function() {
		//关于图片的正则
		var img_reg = /src="(.*?\.jpg)"/img
		var filename
		while (filename = img_reg.exec(content)) {
			//console.log(filename[1])
			getImage(filename[1])
		}
	})
})


//获取图片
function getImage(url) {
	//path模块用于解析文件路径
	var obj = path.parse(url)
	//文件名
	var img_name = obj.base
	//创建文件写入流
	var stream = fs.createWriteStream('./file/' + img_name)
	//兼容网址里面没有根目录的
	if (obj.root.length === 0) {
		url = '/' + url
	}
	//拼接完整的图片url,进行图片的下载
	url = 'https://www.itsource.cn' + url //cn后不要再加/防止冲突
	https.get(url, function(res) {
		//使用管道保存图片
		res.pipe(stream)
	})
}

结果
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无知的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值