当前位置: 首页 > 后端技术 > Node.js

节点爬虫:送你一大堆美腿图

时间:2023-04-03 19:17:23 Node.js

决定送你一组美腿。但授之以渔不如授之以渔。下面我们用node实现一个小爬虫,爬取各种美女。先来看看今天的目标:mmjpg.com美腿频道下的图片开场前先来个科普吧。美腿形容女性美丽、性感、修长的双腿。美腿可分为完美无瑕的大腿、晶莹剔透的小腿、纤细的足部、健康清晰的腿部。所谓腿部健身,就是腿部线条的美。腿的长短和胖瘦是决定腿美丑的两大因素。1.实现步骤确定目标页面使用superagent库获取页面分析页面结构,使用cheerio获取有效信息保存图片到本地打开继续优化2.开始写一个抓取女生图片的爬虫下载librarynpmi这个小项目需要superagentcheeriofs-extra--save这里我们使用superagentcheeriofs-extra的三个库为服务端定制实现fs-extra:丰富fs模块,同时支持async/await2.1请求URL获取HTML使用superagent发起请求,打印页面内容constrequest=require('superagent')constcheerio=require('cheerio')constfs=require('fs-extra')leturl='http://www.mmjpg.com/tag/meitui/'request.get(url+'1')。then(function(res){console.log(res.text)})//可以看到html内容打印到了控制台2.2分析页面结构现在我们要分析页面结构,然后使用cheerio来操作。没用过cheerio也没关系,它的语法和jQuery基本一样。作为前端,在开发者工具中分析页面应该是家常便饭,容易上手。这里我就不多说了,记住我们的目标是找出需要的节点,获取有效信息。可以发现类为pic的div下的列表中,我们需要的东西都在里面。现在我们可以使用cheerio来获取它们...asyncfunctiongetUrl(){constres=awaitrequest.get(url+1)const$=cheerio.load(res.text)$('.picli').each(function(i,elem){consthref=$(this).find('a').attr('href')consttitle=$(this).find('.title').text()控制台。log(title,href)})}getUrl()/*console$nodeapp.js耀眼美女尹飞网袜照耀眼http://www.mmjpg.com/mm/1230宅家丰满诱人身材女神好迷人http://www.mmjpg.com/mm/1164丰乳性感美女浴室照充满诱惑http://www.mmjpg.com/mm/1162美腿修长图97岁小姐姐,外表清纯甜美http://www.mmjpg.com/mm/1157美腿美腿,带给你曼妙的感觉http://www.mmjpg.com/mm/1153图片美女辛夷杨幂美腿的极致诱惑http://www.mmjpg.com/mm/1148丝袜美腿诱惑!甜美女神杨晨晨私房套图http://www.mmjpg.com/mm/1130性感美女刘钰儿透视内衣私照真撩人http://www.mmjpg.com/mm/1127皮肤白了美女模特李晨晨很可爱http://www.mmjpg.com/mm/1126萌妹子林美惠子黑丝浴室私房照福利http://www.mmjpg.com/mm/1124美女赵小米拥有纤细双腿的丝袜照片能玩好几年http://www.mmjpg.com/mm/1111*/2.3解析URL地址很多时候我们需要对URL进行解析,就像点击不同的页码一样观察URL变化http://www.mmjpg.com/tag/meit...,我们很容易发现页码对应着url的最后一个数字查看mmjpg.com的美腿频道,我们可以发现它共有10页,所以我们不写代码判断页数直接写成10。当然这里可以自己实现动态判断总页数,作为一个小练习。asyncfunctiongetUrl(){letlinkArr=[]for(leti=1;i<=10;i++){constres=awaitrequest.get(url+i)const$=cheerio.load(res.text)$('.picli').each(function(i,elem){letlink=$(this).find('a').attr('href')linkArr.push(链接)})}returnlinkArr}2.4获取图片URL现在我们可以获取图库的URL。上一步我们在获取图集的URL时,把页码写死了。这是因为页码不是动态的。但是,每个图集的图片页数不同。这里需要动态判断。进入图集后,切换图片的页码URL也会随之变化,现在这个URL就是每个图片页面的URL。我们只需要获取到最后一页的页码,从1开始遍历,与上面获取到的url拼接,就可以得到每张图片的页面地址了!获取到单张图片URL后,我们可以通过图片的src属性获取真实图片地址,然后实现下载保存asyncfunctiongetPic(url){constres=awaitrequest.get(url)const$=cheerio.load(res.text)//按图集名称划分目录constdir=$('.articleh2').text()console.log(`Create${title}folder`)awaitfs.mkdir(path.join(__dirname,'/mm',title))constpageCount=parseInt($('#page.ch.all').prev().text())for(leti=1;i<=pageCount;i++){letpageUrl=url+'/'+iconstdata=awaitrequest.get(pageUrl)const_$=cheerio.load(data.text)//获取图片的真实地址constimgUrl=_$('#contentimg').attr('src')download(dir,imgUrl)//TODO}}2.5保存图片到本地下面我们来实现下载保存图片的方法,这里使用流(stream)来保存picturesfunctiondownload(dir,imgUrl){console.log(`正在下载${imgUrl}`)constfilename=imgUrl.split('/').pop()constreq=request.get(imgUrl).set({'Referer':'http://www.mmjpg.com'})//mmjpg.com根据Referer限制访问req.pipe(fs.createWriteStream(path.join(__dirname,'mm',dir,filename)))}ok,现在让我们连接我们之前写的函数的函数asyncfunctioninit(){leturls=awaitgetUrl()for(leturlofurls){awaitgetPic(url)}}init()运行这个文件,可以看到终端打印出如下信息,而且你的文件夹里有很多漂亮的图片!你快乐吗?喜不喜?一大波高能美女扑面而来~不删就传不上源码:https://github.com/ogilhinn/m...就算这个小爬虫就完成了,这只是一个非常简单的爬虫。有很多事情需要改进。还可以加很多东西让它更健壮,比如:使用多个userAgent不断改变代理ip来降低爬虫的速度,加一个sleep()...如何让它更健壮,如何处理反爬虫策略保存这些以备后用。3.参考链接源码:https://github.com/ogilhinn/m...superagent:http://visionmedia.github.io/...cheerio:https://github。com/cheeriojs/...fs-extra:https://github.com/jprichards...可以关注我的公众号,一起玩,有技术干货和废话,关注回复【888】和意外惊喜收到左手码右手砖