node爬虫下载图片0字节
发布于 2 个月前 作者 buleZia 889 次浏览 来自 问答

又是我,新的一天新的爬虫问题。 运行结果,程序能跑起来但是下载率实在没法看,是因为什么问题导致这样,有解决方法吗 1505376783.png 贴一下拙劣的代码。

var cheerio = require("cheerio");
	http = require("http"),
	https = require("https"),
	request = require("request");
	fs =require("fs"),
	path =require("path"),
	util = require('util');

var	url = 'http://www.ivsky.com/tupian/';
	dir = 'D:/download/',
	dir = mkdirSync(dir);

function main(){
	for(i=0;i<5;i++){
		if(i!=0){
			var index = 'index_' + i + '.html';
		}else{
			var index = '';
		}
		_url = url + index;
			//console.log(_url);
			downHtml(_url);
	}
	
}

// 获取html
function downHtml(url){
	http.get(url, function(res){
		var data="";
		res.setEncoding("utf-8");
		res.on('data', function(chunk){
			data += chunk;
		});
		res.on("end", function(){
			var $ = cheerio.load(data);
			var allhref=[];
			$('.il_img a').each(function(i, e){
				allhref[i] = 'http://www.ivsky.com' + $(e).attr('href');
				for(i=0;i<allhref.length;i++){
					str = encodeURI(allhref[i]);
					download(str);
				}
			})
		});
	}).on("error", function(){
		return null;
	});
}

//遍历图片
function download(url){
	http.get(url, function(res){
		var data="";
		res.setEncoding("utf-8");
		res.on('data', function(chunk){
			data += chunk;
		});
		res.on("end", function(){
			var $ = cheerio.load(data);
			$('img').each(function(i, e){
				downImg($(e).attr('src'), dir);
			})
		});
	}).on("error", function(){
		return null;
	});
}
//包装了模块就函数进行复写
/*server.download(url, function(data){
	if(data){
		//console.log(data);
		var $= cheerio.load(data);
		$('img').each(function(i, e){
			//console.log($(e).attr('src'));
			downImg($(e).attr("src"), dir)
		})
	}
});*/


//创建目录
function mkdirSync(dir){
	fs.existsSync(dir) || fs.mkdirSync(dir);
	return dir;
}

//下载图片
function downImg(url, dir){
	var startTime = new Date().getTime();
	url = encodeURI(url);
	var fileName = url.split('/').pop();
	//var img_name = $('il_img a').attr('title').trim() + '.jpg';
	request(url).on('response', function(){
		var endTime = new Date().getTime();
		console.log('downloading..%s..%ss', url, (endTime-startTime)/1000);
	})
	.pipe(fs.createWriteStream(dir + fileName)
		)
	.on('error', function(){console.log('failed to download');});
}



main();//执行主函数
17 回复

发现,有规律!!

var cheerio = require("cheerio");     // 分号
	http = require("http"),         	// 逗号
	https = require("https"),          // 逗号
	request = require("request");    // 分号 
 	fs =require("fs"),                   // 逗号
	path =require("path"),           // 逗号
	util = require('util');                  // 分号

我也遇到过,异步操作的问题。用Promise或者await async.

大家写的下载都是这个代码?我不知道看到多少次一模一样的代码了。一个 request 模块单独拿去下载真的奢侈,http 把二进制写入文件就是下载了。还有这种情况的原因多半是同一时间请求太多出错,用 async 函数的 eachLimit 来控制并发数是最好的选择,我以前写过一个下载小说的爬虫,不控制并发铁定出错。控制并发就能完美下载,而且你的错误处理也没有提示。所以看不到错误提示。

@leavesdrift 老哥 你那个爬小说的 在git有代码吗 我想研究下爬虫

@dengnan123 你邮箱多少呢我发给你吧

你要不要考虑用stream来下载图片

帮你看了下代码,估计是请求过大,爆了。如果要做爬虫的话,请求量最好还是做个限制

@dengnan123 你进到 http://176.128.39.187:81/ 然后下载 scrapy.tar.gz 吧,gmail 并不允许我发js,然后 tar -zxvf 解压,用的话先安装里面用到的包,request.js 是自己写的不用管,安装好后这样用

// 查询小说
node bqg3.js --b='书名'

// 按查询结果选定小说,比如选定第一本
node bqg3.js --b='书名' --n=1

// 阅读某章节,比如第254章
node bqg3.js --b='书名' --n=1 --c=254

// 下载一些章节,比如[1,254],控制并发数为8
node bqg3.js --b='书名' --n=1 --c=[1,254] --d=8

@leavesdrift zip压缩一下不是可以吗?

@mumudev zip 咋用我去查查,我没用过zip…

@leavesdrift OK 下载好了 我去研究下

@dengnan123 好的,有空多交流,都是学习阶段。微信 : jc13125335,等最近忙过了我想研究下爬虫的模拟登录,不太会

@leavesdrift 是什么系统呀,mac和win在界面上右键就可以zip压缩了,系统自带的。linux的话,用命令行zip也可以压缩,也是系统自带的

@mumudev ubuntu用惯了 tar , 没事顺便记录了下 zip 用法

回到顶部