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

不再羡慕python,nodejs爬虫撸起袖子干活,爬宅女神网大姐姐高清图片!

时间:2023-04-03 12:53:34 Node.js

几年前,我无意工作,所以上班时,发现了一篇分享python爬虫的文章。感觉他爬的网站里的妹子都很好看,很喜欢这个地方,个个都很漂亮。不小创意:自我发现爬虫实战1:抓取一批宅男女神图片,分类保存在本地和MongoDB数据库中。但是python虽然用了很久,但是也弃用了很久。最近在用nodejs重构后台界面,所以尝试用nodejs实现一个爬虫。先上传几张图片:爬几张相册演示一下,都是高清无码大图。好的,让我们开始准备吧,男孩!你好!我说的是准备工作环境!你你你,放下你的纸巾!准备工作:系统环境:mac(作为前端不用解释?)运行环境:node(作为前端不用解释??)所需模块:request-promise,cheerio,fsEdit工具:vscode(谁用谁知道)简单看下这几个nodejs模块:request-promise----Node.js的网络请求模块,使用超级简单:varrequest=require('请求-承诺');request('http://www.google.com').then(function(htmlString){console.log(htmlString)}).catch(function(err){});任何响应都可以输出到文件流:request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))cheerio----一个快速、灵活且实现了专门为服务器定制的jQuery核心实现:API类似于jQuery,使用超级简单constcheerio=require('cheerio')const$=cheerio.load('Helloworld')$('h2.title').text('你好!')$('h2').addClass('welcome')$.html()//=>你好!fs----Node.js文件系统可以创建目录,创建文件,读取文件等网页分析:分析目标网站的相册页面地址,因为python文章的作者网站已经详细分析过了,我就简单分析一下。随便打开几个相册,可以看到这样的规则:“https://www.****.com/g/****/”这样我们就可以确定要抓取的基本url:constbase_url='https://www.****.com/g/';//抓取相册页面的baseURL然后看几乎每个相册底部的页码,以及我们要抓取的内容是整个相册,所以需要考虑分页的情况,点击分页,我们看到分页的url是这样的:“https://www.****.com/g/****/*.html"业务逻辑:实际代码:app.js轮询和代码结构constnvshens=require('./co');constbase_url='https://www.nvshens.com/g/';//爬取相册页面URL的基础letindex=1;letstart=25380;constend=30000;constmain=async(URL)=>{//1。请求URLconstdata=awaitnvshens.getPage(URL);//2。判断是否存在Albumif(nvshens.getTitle((data.res))){//3.下载照片awaitnvshens.download(data.res);//4。请求分页索引++;constnew_url=`${base_url}${start}/${index}.html`;主要(新网址);}else{索引=1;console.log(`${base_url}${start}pagecompleted`)start++;如果(开始<结束){//5.请求下一个URLmain(base_url+start);}else{console.log(`${base_url}${end}Allpagescompleted`)}}};main(base_url+start);co.js//业务代码varrequest=require('request-prom是');//网络请求constcheerio=require("cheerio");//操作domconstfs=require("fs");//读写文件constheaders={"Referer":"https://www.nvshens.com/g/24656/"}//因为有些网站在解决盗链问题时是根据Referer的值来判断的,所以在请求头中加上Referer属性就好了(可以填写爬取网站的地址)//另外,Referer携带的数据用于告诉服务器当前请求来自哪个页面。constbasePath="/Users/username/Desktop/mm/";//自定义mac本地下载目录,需要提前创建,windows路径可参考注释letdownloadPath;letpageIndex=1;module.exports={//请求页面asyncgetPage(url){constdata={url,res:awaitrequest({url:url})}returndata;},//判断页面是否有相册getTitle(data){const$=cheerio.load(data);如果($("#htilte").text()){下载路径=basePath+$("#htilte").text();//创建专辑if(!fs.existsSync(downloadPath)){fs.mkdirSync(下载路径);console.log(`${downloadPath}文件夹创建成功`)}returntrue;}else{返回错误;}},//下载相册图片asyncdownload(data){if(data){var$=cheerio.load(data);$("#hgallery").children().each(async(i,elem)=>{constimgSrc=$(elem).attr('src');constimgPath="/"+imgSrc.split("/").pop().split(".")[0]+"."+imgSrc.split(".").pop();console.log(`${downloadPath+imgPath}下载`)const我是gData=awaitrequest({uri:imgSrc,resolveWithFullResponse:true,headers,}).pipe(fs.createWriteStream(downloadPath+imgPath));})console.log("pagedone")}},}runnodeapp用.js的几个功能就可以实现,是不是很简单?