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

节点学习记录:图片爬虫

时间:2023-04-04 01:30:56 Node.js

一constrequest=require('request');request封装了httpnpmrequest(url,(err,req)=>{letbody=req.body})两个constcheerio=require('cheerio');解析返回的html并支持jqlet$=cheerio.load(body,{decodeEntities:false});三个lodash非常有用的函数_.isObject()_.isString()捕获过程包括request对象发送一个http请求到url到html然后开始回调并用cheerio加载我们的body并使用accessing的语法jq访问元素并获取我们的东西。lib封装的过程拆分:请求部分交给spider.js入口,解析部分和parse.js处理spider.js模块返回一个函数完成请求的发送。returnrequest(opts)spider需要做的其实是完成对捕获配置参数的封装。捕捉业务,抽象。module.export=蜘蛛;之前写过一个简单爬取课程目录的爬虫,今天写一个图片爬虫。基本思路是通过查看代码,观察我们要批量爬取资源的站点的url请求,找出一些规律。,不同网站的复杂度是不一样的。通常爬取图片的计算比较简单,解析规则,构造请求页面地址,nodejs模块request模拟请求页面数据(简单的静态页面可能需要模拟ajax请求拦截数据),使用cheerio模块来从请求的页面数据中解析出我们需要的资源地址(一个类似jquery的DOM库),最后进行简单的批量下载(瞬间发送大量请求可能会被站点调和,所以一次性的时候爬取量大,注意async限制异步和并发请求量,并发控制要根据不同站点区别对待,这里暂不做)教程1.创建项目创建文件夹mkdirimage_spider&&cdimage_spider创建依赖文件package.jsonnpminit下载模块npminstallasynccheerioscolorsrequest--save-devfs和path模块都是nodejs自带的,主要有以下两个,一个是request模块和cheerio模块,附有颜色模块。简单来说,request模块用于请求一个网页,cheerio解析请求的网页,即从html中解析出图片的src地址,并使用request获取页面的htmlbody并返回HTML请求的页面,然后我们应该使用cheerio模块来解析这个页面,这是analysisData()函数所做的2.创建index.jsvimindex.js按esc并输入:wq保存并退出3.写入index.jsconstfs=require('fs');constpath=require('路径');constrequest=require('请求');constcheerio=require('cheerio');constcolors=require('颜色');constpackagejson=require('./package.json');console.log("version"+packagejson.version.cyan)//测试站点如jandan.net/ooxx/page-1000varurltxt='http://jandan.net/ooxx/page-',startpage=1200,//起始页endpage=1300,sourcedir='images',//资源目录名picdir=sourcedir+''+startpage+'_'+endpage+'/',creatdir='./'+picdir;//------------------------------------------//创建图片存放目录//fs.mkdir这里有个隐患。直接使用它创建一个已有的文件夹会报错,在不存在的一级目录下创建二级目录也会报错。封装fs.mkdir后会被修改//----------------fs.mkdir(creatdir,function(err){if(err){throwerr};//letnewsourcesrc='目录'+creatdir+'创建成功';console.log(newsourcesrc.cyan);});//------------//抓取指定范围页面//------------console.log('--------------开始抓取页面内容----------------'.cyan);for(vari=startpage;i,如果$('.textimg'),把herf改成src,其他站点类似varpics_src=pic[i].attribs.href;如果(pics_src.indexOf('http')>0){varimgsrc=pics_src;}else{varimgsrc='http:'+pics_src;};控制台日志(imgsrc.green);//输出地址varfilename=parseUrlForFileName(imgsrc);//生成文件名downloadImg(imgsrc,filename,function(){console.log(filename.cyan+'done');});}console.timeEnd("----创建当前页面下载任务定时器----");}//图片命名函数parseUrlForFileName(address){varfilename=path.basename(address);返回文件名;}//------------------------------------//下载并保存//NodeJs路径APIhttp://nodejs.org/api/path.html#path_path_basename_p_ext//request.head==""fsmodulecreateWriteStreamwrite进入指定目录//当爬取资源较大时使用async限制异步并发,因为并发节点连接太多,可能会和谐//------------------------------------vardownloadImg=function(uri,filename,callback){request.head(uri,function(err,res,body){console.log('content-type:',res.header['content-type']);//返回图片的类型console.log('content-length:',res.header['content-length']);//图片大小if(err){console.log('err:'+err);返回假;}console.log('request:'+res);request(uri).pipe(fs.createWriteStream(picdir+filename)).on('close',function(){console.log(filename.cyan+"保存成功");//请求的流数据管道被保存到picdir文件夹});});};};通过查看页面元素,我们可以看到这些女孩的图片被放置在class="text"下的img标签中,可以看到我们已经获取了该页面所有图片的地址。最后一步是下载这些图片。你不能把这些地址一个一个复制,然后粘贴到浏览器中,右键另存为。首先,我们需要解析这些图片的文件名。解析文件名非常简单。可以通过调用path模块中的basename方法获取URL中的URL。文件名现在我们有了图片的地址和名称,我们就可以下载了。这里调用request模块的head方法进行下载。请求完图片后,我们调用fs文件系统模块中的createWriteStream将其下载到本地目录。有些网站有反爬机制,并不是每个网站都能被爬取。下回讲到反爬虫机制,推送到github仓库,操作过程同pc)平台,安装nodejs、git等环境步骤都是通用的,这里不再赘述。将此目录复制到gitclone安装相关依赖,切换到clone目录安装依赖并运行(推荐cnpminstall),具体爬虫参数修改见注释,如有错误请指正cdimages_spidercnminstallcrawlerrunsindex.jsnode索引参考链接cheerio官网请求官网读取通过cheerioAPINodeJs路径APINodeJs妹图爬虫Node.js爬虫爬取58同城租房信息