nodejs抓取动态网页(下载壁纸的URL(幕后BOSS现身@ーー))

优采云 发布时间: 2021-12-06 06:18

  nodejs抓取动态网页(下载壁纸的URL(幕后BOSS现身@ーー))

  分页:column/index_specific page number.htm

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

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

  使用chrome开发者工具可以发现缩略图列表在div中,a标签的href属性值为单张壁纸所在的页面。

  部分代码:

  

request

.get(url)

.end(function(err, sres){

var $ = cheerio.load(sres.text);

var pic_url = []; // 中等图片链接数组

$('.list ul', 0).find('li').each(function(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. 用“”继续分析

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

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

  4. 用“”继续分析

  打开这个页面,我们最后会下载壁纸,放到一张桌子上。如下所示,

  这是我们最终要下载的图片的网址(BOSS终于出现在幕后了(@ ̄ー ̄@))。

  下载图片的代码:

  

request

.get(wallpaper_down_url)

.end(function(err, img_res){

if(img_res.status == 200){

// 保存图片内容

fs.writeFile(dir + '/' + wallpaper_down_title + path.extname(path.basename(wallpaper_down_url)), img_res.body, 'binary', function(err){

if(err) console.log(err);

});

}

});

  打开浏览器访问:1314/fengjing

  选择栏目和页面,点击“开始”按钮:

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

  完成~

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

  附上完整图片下载代码:

  

/**

* 下载图片

* @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'; // 域名

request

.get(url)

.end(function(err, sres){

var $ = cheerio.load(sres.text);

var pic_url = []; // 中等图片链接数组

$('.list ul', 0).find('li').each(function(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));

}

});

var count = 0; // 并发计数器

var wallpaper = []; // 壁纸数组

var fetchPic = function(_pic_url, callback){

count++; // 并发加1

var delay = parseInt((Math.random() * 10000000) % 2000);

console.log('现在的并发数是:' + count + ', 正在抓取的图片的URL是:' + _pic_url + ' 时间是:' + delay + '毫秒');

setTimeout(function(){

// 获取大图链接

request

.get(_pic_url)

.end(function(err, ares){

var $$ = cheerio.load(ares.text);

var pic_down = url_model.resolve(domain, $$('.pic-down').find('a').attr('href')); // 大图链接

count--; // 并发减1

// 请求大图链接

request

.get(pic_down)

.charset('gbk') // 设置编码, 网页以GBK的方式获取

.end(function(err, pic_res){

var $$$ = cheerio.load(pic_res.text);

var wallpaper_down_url = $$$('#endimg').find('img').attr('src'); // URL

var wallpaper_down_title = $$$('#endimg').find('img').attr('alt'); // title

// 下载大图

request

.get(wallpaper_down_url)

.end(function(err, img_res){

if(img_res.status == 200){

// 保存图片内容

fs.writeFile(dir + '/' + wallpaper_down_title + path.extname(path.basename(wallpaper_down_url)), img_res.body, 'binary', function(err){

if(err) console.log(err);

});

}

});

wallpaper.push(wallpaper_down_title + '下载完毕<br />');

});

callback(null, wallpaper); // 返回数据

});

}, delay);

};

// 并发为2,下载壁纸

async.mapLimit(pic_url, 2, function(_pic_url, callback){

fetchPic(_pic_url, callback);

}, function (err, result){

console.log('success');

res.send(result[0]); // 取下标为0的元素

});

});

};

  需要特别注意的两点:

  1.“碧安桌面”网页的编码为“GBK”。而 nodejs 本身只支持“UTF-8”编码。这里我们引入了“superagent-charset”模块来处理“GBK”的编码。

  附上一个来自github的例子

  2. nodejs 是异步的。同时发送的大量请求可能被服务器当作恶意请求拒绝。所以这里引入了“async”模块进行并发处理,使用的方法是:mapLimit。

  mapLimit(arr, limit, iterator, callback)

  这个方法有4个参数:

  第一个参数是一个数组。

  第二个参数是并发请求数。

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

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

  该方法的作用是将arr中的每个元素并发限制次数交给迭代器执行,执行结果传递给最终的回调。

  后记

  至此,图片的下载完成。

  完整代码已经放在github上

  以上是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助。同时也希望大家多多支持和喜爱阅读建站教程!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线