您的位置:首页 > 理论基础 > 计算机网络

Node.js 使用爬虫批量下载网络图片到本地

2017-09-30 10:43 465 查看
图片网站往往广告众多,用Node.js写个爬虫下载图片,代码不长,省事不少,比手动一张张保存简直是天与地的区别。以前用Java也做过远程图片下载,但Node.js的下载速度更让人咂舌,这也是非阻塞式变成的好处。

下面代码是一个从mtl.ttsqgs.com下载图片的程序,图片地址是看网站源码看出来的,总共有多少张也可以在网页或源码里找到,然后就是顺藤摸瓜。爬虫无外乎找规律再写代码实现的套路。

// 内置http模块,提供了http服务器和客户端功能
var http=require("http");

// cheerio模块,提供了类似jQuery的功能
var cheerio = require("cheerio");

// 内置文件处理模块
var fs=require('fs');

// 请求参数JSON
var options;

// 请求并获得数据
var req;

var index=1; // 起始页码
var endIndex=43; // 终止页码

function downloadImg(pageNumber){
console.log("开始读取第"+pageNumber+"页");

// eg:http://mtl.ttsqgs.com/images/img/4527/3.jpg
options={
hostname:'mtl.ttsqgs.com',// 这里别加http://,否则会出现ENOTFOUND错误
port:80,
path:'/images/img/798/'+pageNumber+'.jpg',// 子路径
method:'GET',
};

req=http.request(options,function(resp){
var imgData = "";
resp.setEncoding("binary");

resp.on('data',function(chunk){
imgData+=chunk;
});

resp.on('end',function(){
var fileName="./xyyx/"+pageNumber+".jpg";
fs.writeFile(fileName, imgData, "binary", function(err){
if(err){
console.log("文件"+fileName+"下载失败.");
}
console.log(fileName+"下载成功");
});
});
});

// 超时处理
req.setTimeout(5000,function(){
req.abort();
});

// 出错处理
req.on('error',function(err){
if(err.code=="ECONNRESET"){
console.log('socket端口连接超时。');
}else{
console.log('请求发生错误,err.code:'+err.code);
}
});

// 请求结束
req.end();

// 43页调完
if(index<endIndex){
index++;
console.log('继续第'+index+'页');
start(index);
}
}

// 包一层函数
function start(i){
downloadImg(i);
}

// 开始
start(index);


2017年9月30日10:43:27
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: