Node.js实现爬虫什么是爬虫?网络爬虫(也称网络蜘蛛、网络机器人,在FOAF社区更常被称为网络追逐者),是一种按照一定规则自动抓取万维网上信息的程序或脚本。其他不太常用的名称包括ant、autoindex、emulator或worm。大多数爬虫遵循“发送请求”-“获取页面”-“解析页面”-“提取并存储内容”的过程,这实际上模拟了使用浏览器获取网页信息的过程。所需模块puppeteer,下载puppeteer模块,用于Node.js爬虫mongoose,下载mongoose模块,用于连接数据库,将爬取到的数据传入数据库。//下载puppeteernpminstallpuppeteer//下载mongoosenpminstallmongoose正式开始这里抓取豆瓣的电影信息进行测试!看到上面的电影信息列表,是不是有爬取列表信息的冲动呢?好了,我们先打开开发者选项,查看列表信息。我们可以看到每个li标签的data-xxx属性包含了电影item的信息。我们获取信息并输出到接口或者存入数据库,实现了各种爬虫。一小部分用途。话不多说,我们上代码。使用爬虫获取界面上的电影列表信息//引入puppeteer模块constpuppeteer=require('puppeteer');//爬取热门电影信息,网站consturl='https://movie.douban.com/cinema/nowplaying/beijing/';//因为我们要请求信息,这里添加asyncmodule.exports=async()=>{//1.打开浏览器constbrowser=awaitpuppeteer.launch({args:['--no-sandbox'],//headless:false//以无头浏览器的形式打开浏览器,无界面显示,后台运行});//2。创建标签页constpage=awaitbrowser.newPage();//3。跳转到指定的URLawaitpage.goto(url,{waitUntil:'networkidle2'//等待网络空闲,然后跳转加载页面});//4。等待URL加载,开始爬取数据//开启延时器,延时2秒再爬取数据awaittimeout();letresult=awaitpage.evaluate(()=>{//对加载的页面进行Dom操作//所有爬取的数据数组letresult=[];//获取所有热门电影的li,这里可以打开开发者过滤标签的选项const$list=$('#nowplaying>.mod-bd>.lists>.list-item');//这里我们只取8条数据for(leti=0;i<8;i++){constliDom=$list[i];//电影标题lettitle=$(liDom).data('title');//电影评分letrating=$(liDom).data('score');//影片长度让runtime=$(liDom).data('duration');//director让directors=$(liDom).data('director');//主演letcasts=$(liDom).data('actors');//豆瓣idletdoubanId=$(liDom).data('subject');//电影详情页面URLlethref=$(liDom).find('.poster>a').attr('href');//电影海报图片letimage=$(liDom).find('.poster>a>img').attr('src');//将爬取到的数据加入数组result.push({title,rating,runtime,directors,casts,href,image,doubanId})}//返回爬取到的数据})console.log(结果);//遍历爬取的8个itemDatafor(leti=0;i{letgenre=[];//typeconst$流派=$('[property="v:genre"]');对于(letj=0;j<$genre.length;j++){genre.推($流派[j]。innerText);}//简介constsummary=$('[property="v:summary"]').html().replace(/\s+/g,'');//发布日期constreleaseDate=$('[property="v:initialReleaseDate"]')[0].innerText;//向单个对象添加两个属性return{genre,summary,releaseDate}})//console.log(itemResult);//在末尾添加当前对象的三个属性Attribute//没有办法在evaluate函数中读取服务器中的变量item.genre=itemResult.genre;item.summary=itemResult.summary;item.releaseDate=itemResult.releaseDate;}控制台日志(结果);//5.关闭浏览器awaitbrowser.close();//最后将所有数据返回returnresult;}functiontimeout(){returnnewPromise(resolve=>setTimeout(resolve,2000))}将爬取的数据保存到数据库中并建立数据库连接至此我们介绍mongoose连接数据库,代码就不多说了。//引入mongooseconstmongoose=require('mongoose');module.exports=newPromise((resolve,reject)=>{//连接数据库mongoose.connect('mongodb://localhost:27017/movie_list',{useNewUrlParser:true,useUnifiedTopology:true});//绑定事件监听mongoose.connection.once('open',err=>{if(!err){console.log('数据库连接成功~~');resolve();}else{reject('Databaseconnectionfailed:'+err);}})})数据库建表//引入mongooseconstmongoose=require('mongoose');//获取SchemaconstSchema=mongoose.Schema;//创建约束对象consttheatersSchema=newSchema({title:String,rating:Number,runtime:String,directors:String,casts:String,image:String,doubanId:{type:Number,unique:true},genre:[String],summary:String,releaseDate:String,posterKey:String,//图片上传到七牛,返回key值createTime:{type:Date,default:Date.now()}})//创建模型对象constTheaters=mongoose.model('Theaters',theatersSchema);//暴露module.exports=Theaters;履带式将爬取的数据导入数据库//引入TheatersconstTheaters=require('../../model/theaters');module.exports=asyncdata=>{for(vari=0;i{//连接数据库awaitdb;d//抓取数据constdata=awaittheatersCrawler();//将爬取到的数据保存到数据库中awaitsaveTheaters(data);})()如果有帮助,请点个赞!