编写爬虫爬取www.itsource.cn首页中的图片
原理
发起请求
使用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)
})
}
结果