又是我,新的一天新的爬虫问题。 运行结果,程序能跑起来但是下载率实在没法看,是因为什么问题导致这样,有解决方法吗 贴一下拙劣的代码。
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();//执行主函数
发现,有规律!!
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 下载好了 我去研究下
@mumudev 搞定。
@dengnan123 好的,有空多交流,都是学习阶段。微信 : jc13125335,等最近忙过了我想研究下爬虫的模拟登录,不太会
@leavesdrift 是什么系统呀,mac和win在界面上右键就可以zip压缩了,系统自带的。linux的话,用命令行zip也可以压缩,也是系统自带的
@mumudev ubuntu用惯了 tar , 没事顺便记录了下 zip 用法