手机版

使用nodejs下载风景壁纸

时间:2021-09-06 来源:互联网 编辑:宝哥软件园 浏览:

需要使用的第三方模块有:

超级试剂

Superagent-charset(手动指定编码以解决GBK的中文乱码)

再见

表达

异步(并发控制)

完整的代码可以从我的github下载。主要逻辑在netbian.js中.

以另一侧桌面(http://www.netbian.com/)栏下的风景壁纸(http://www.netbian.com/fengjing/index.htm)为例。

1.分析网址

不难发现:

主页:列/索引. htm

分页:列/索引特定页面number.htm。

知道了这个规则,就可以批量下载壁纸了。

2.分析壁纸的缩略图,找到对应壁纸的大图

使用chrome的开发者工具,可以发现缩略图列表在class='list '的div中,A标签的href属性的值就是单个壁纸所在的页面。

部分代码:

请求。获取(网址)。end(function(err,sres){ var $=cheerio . load(sres . text);var pic _ URL=[];//中等图片链接数组$('。listul ',0)。查找(' li ')。每个(函数(index,ele){ var ele=$(ele);var href=ele.find('a ')。eq(0)。attr(' href ');//中等图片链接if(href!=undefined){ pic _ URL . push(URL _ model . resolve(domain,href));} });});3.用“http://www . net bian.com/desk/17662 . htm”继续分析

打开此页面,发现此页面显示的壁纸仍然不是最高分辨率。

单击“下载壁纸”按钮中的链接打开新页面。

4.用“http://www . net bian.com/desk/17662-1920 x1080 . htm”继续分析

打开这个页面,我们将下载壁纸并放在一张桌子上。下图,http://img . netbian.com/file/2017/0203/bb 109369 a1 f2eb 2e 30 e 04 a 435 F2 be 466 . jpg

是我们最后要下载的图片的URL(BOSS最后出现在幕后(@ ~~@))。

下载图片的代码:

request.get(壁纸_down_url)。end(function(err,Img _ RES){ if(Img _ RES . status==200){//保存图片内容fs.writefile (dir'/'壁纸_ down _ title path . extname(path . basename(壁纸_ down _ URL)),img_res.body,' binary ',function(err){ if(err)console . log(err);});}});打开浏览器,访问http://本地主机33601314/枫泾

选择列和页面,然后单击“开始”按钮:

同时请求服务器下载图片。

完成~

图片的存储目录以列页码的形式保存。

附上完整的图片下载代码:

/** * 下载图片* @param {[type]} url [图片URL] * @param {[type]} dir [存储目录]* @ param {[type]} RES[description]* @ return {[type]}[description]*/var down _ pic=function(URL,dir,RES){ var domain=' http://www。netbian。com ';//域名请求。获取(网址)。end(function(err,sres){ var $=cheerio。负载(sres。文本);var pic _ URL=[];//中等图片链接数组$('.列表ul ',0).查找('里').每个(函数(index,ele){ var ele=$(ele);var href=ele.find('a ').等式(0).attr(' href ');//中等图片链接if(href!=未定义){ pic _ URL。推送(URL _ model。resolve(domain,href));} });定义变量计数=0;//并发计数器定义变量壁纸=[];//壁纸数组var fetchPic=function(_pic_url,回调){ count//并发加1 var延迟=parsent((数学。random()* 1000000)% 2000;console.log('现在的并发数是: '计数,正在抓取的图片的统一资源定位器是:' _pic_url '时间是:"延迟"毫秒');setTimeout(函数(){ //获取大图链接请求获取(_pic_url).end(function(err,ares){ var $ $=cheerio。负荷(阿瑞斯。文本);var pic_down=url_model.resolve(域,$$(')。俯视图').查找(' a ').attr(' href ');//大图链接计数-;//并发减1 //请求大图链接请求get(pic_down).charset('gbk') //设置编码,网页以GBK的方式获取end(function(err,pic _ RES){ var $ $ $=cheerio。加载(pic _ RES . text);定义变量壁纸_ down _ URL=$ $ $(' # ending ').查找(' img ').attr(' src ');//网址var壁纸_ down _ title=$ $ $(' # ending ').查找(' img ').attr(' alt ');//标题/下载大图请求获取(壁纸_down_url).end(function(err,img _ RES){ if(img _ RES . status==200){//保存图片内容fs.writeFile(目录'/'壁纸_向下_标题路径。扩展名(路径。basename(壁纸_down_url)),img_res.body,“binary”,函数(err){ if(err)console。日志(err);});} });壁纸。推送(壁纸_向下_标题'下载完毕br/');});回调(null,壁纸);//返回数据});},延迟);};//并发为2,下载壁纸async.mapLimit(pic_url,2,函数(_pic_url,回调){ fetchPic(_pic_url,回调);},函数(错误,结果){控制台。日志(“成功”);res.send(结果[0]);//取下标为0的元素});});};特别需要注意的两点:

1."彼岸桌面"网页的编码是“GBK”的。而nodejs本身只支持“UTF-8”编码。这里我们引入"超级代理-字符集"模块,用于处理“GBK”的编码。

附上开源代码库里的一个例子

https://github.com/magicdawn/superagent-charset

2.nodejs是异步的,同一时间发送大量的请求,有可能被服务器认为是恶意请求而拒绝。因此这里引入"异步"模块,用于并发的处理,使用的方法是:地图限制。

映射限制(arr,Limit,迭代器,回调)

这个方法有四个参数:

第一个参数是数组。

第2个参数是并发请求的数量。

第3个参数是迭代器,通常是一个函数。

第四个参数是并发执行后的回调。

这个方法的作用是将到达)中的每个元素同时并发限制次拿给迭代程序去执行,执行结果传给最后的回调。

后话

至此,便完成了图片的下载。

完整的代码,已经放在开源代码库上

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

版权声明:使用nodejs下载风景壁纸是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。