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

使用NodeJS实现一个网络爬虫小应用——爬取博客园首页文章列表

时间:2023-04-04 00:39:37 Node.js

前言网络爬虫(又称网络蜘蛛、网络机器人,在FOAF社区更常被称为网络追赶者),是一个程序或根据一定规则自动从万维网上抓取信息的脚本。其他不太常用的名称包括ant、autoindex、emulator或worm。我们可以利用网络爬虫来自动收集数据信息,比如在搜索引擎中爬取和收集站点,在数据分析和挖掘中收集数据,在财务分析中收集财务数据。此外,网络爬虫还可以应用于舆情监测分析、目标客户数据采集等各个领域。1.网络爬虫的分类根据系统结构和实现技术,网络爬虫大致可以分为以下几种类型:通用网络爬虫、聚焦网络爬虫和增量网络爬虫。爬虫),深网爬虫。实际的网络爬虫系统通常是由多种爬虫技术组合实现的。下面分别简单介绍一下这些爬虫。1.1.通用网络爬虫也称为可扩展网络爬虫。其爬取对象从一些种子URL扩展到整个Web,主要为门户网站搜索引擎和大型Web服务商收集数据。1.2.Focusedwebcrawler,也称为TopicalCrawler,是指有选择地爬取与预先定义的主题相关的页面的网络爬虫。与通用网络爬虫相比,专注爬虫只需要爬取与主题相关的页面,大大节省了硬件和网络资源。存页数也因为数量少更新快,也能满足特定领域的一些特定人群。信息需求。1.3.增量网络爬虫是指增量更新下载的网页,只爬取新生成或变化的网页的爬虫。可以在一定程度上保证爬取的页面尽可能的新。.1.4.深网爬虫网页按存在方式可分为表层网页(SurfaceWeb)和深层网页(DeepWeb,又称InvisibleWebPages或HiddenWeb)。表面网页是指可以被传统搜索引擎收录的页面,主要由可以通过超链接到达的静态网页组成。深网是指那些大部分内容无法通过静态链接获取,隐藏在搜索表单后面,只能通过用户提交一些关键字才能获取的网页。2.创建一个简单的爬虫应用简单了解了上面的爬虫之后,我们来实现一个简单的爬虫应用。2.1.要实现目标说到爬虫,大概率会想到大数据,然后就会联想到Python。百度之后,Python爬虫确实多了。由于我主要是做前端开发,相对来说JavaScript更熟练也更简单。实现一个小目标,使用NodeJS爬取博客园(我经常用的一个开发者网站)首页文章列表,然后写入本地JSON文件。2.2.环境搭建NodeJS:需要在电脑上安装NodeJS,如果没有安装,请到官网下载安装。npm:NodeJS包管理工具,随NodeJS一起安装。安装好NodeJS后,打开命令行,使用node-v查看NodeJS是否安装成功,使用npm-v查看NodeJS是否安装成功,安装成功后应该打印如下信息(不同版本有差异):2.3,具体实现2.3.1,安装依赖包在该目录下执行npminstallsuperagentcheerio--save-dev安装superagent和cheerio这两个依赖包。创建一个crawler.js文件。superagent:SuperAgent是一个轻量级、灵活、易读、学习曲线低的客户端请求代理模块,用于NodeJS环境。cheerio:cheerio是为服务器设计的核心jQuery的快速、灵活和精益实现。它可以像jquery一样操作字符串。//导入依赖包consthttp=require("http");constpath=require("path");consturl=require("url");constfs=require("fs");constsuperagent=require(“superagent”);constcheerio=require(“cheerio”);2.3.2。爬取数据,然后获取请求页面。获取到页面内容后,根据自己想要的数据解析返回的DOM,最后将处理后的结果JSON转换成字符串保存到本地。//抓取页面地址constpageUrl="https://www.cnblogs.com/";//字符串解码函数unescapeString(str){if(!str){return''}else{returnunescape(str.replace(/&#x/g,'%u').replace(/;/g,''));}}//抓取数据函数fetchData(){console.log('抓取数据时间节点:',newDate());superagent.get(pageUrl).end((error,response)=>{//页面文档数据letcontent=response.text;if(content){console.log('获取数据成功');}//定义一个接收数据的空数组=$(value).find('a.titelnk');letitemFoot=$(value).find('.post_item_foot');lettitle=titleLnk.html();//标题lethref=titleLnk.attr('href');//Linkletauthor=itemFoot.find('a.lightblue').html();//AuthorletheadLogo=$(value).find('.post_item_summaryaimg').attr('来源');//头像letsummary=$(value).find('.post_item_summary').text();//引入letpostedTime=itemFoot.text().split('发布于')[1].substr(0,16);//发布时间letreadNum=itemFoot.text().split('reading')[1];//读取量readNum=readNum.substr(1,readNum.length-1);标题=unescapeString(标题);href=unescapeString(href);作者=unescapeString(作者);headLogo=unescapeString(headLogo);摘要=unescapeString(摘要);postedTime=unescapeString(postedTime);readNum=unescapeString(readNum);,标题,href,作者,headLogo,摘要,postedTime,readNum});});//将数组转换为字符串result=JSON.stringify(result);//写入本地cnblogs.json文件fs.writeFile("cnblogs.json",result,"utf-8",(err)=>{//监听错误,如果输出正常,打印nullif(!err){console.log('数据写入成功');}});});}获取数据();3、执行优化3.1、生成结果在项目目录下打开命令行,输入nodecrawler.js,会发现目录下会创建一个cnblogs.json文件,打开文件如下:打开首页博客园对比一下:发现你已经成功爬到首页了。想要的文章列表3.2,定时爬取发现每次执行都只能获取到数据。价格计时器允许它每五分钟自动抓取一次。代码如下:···//每5分钟请求一次setInterval(()=>{fetchData()},5*60*1000);···4.总结网络爬虫的应用远不止于此。以上只是对网络爬虫的简单介绍,并实现了一个小demo。如有不足,欢迎指正参考资料:https://baike.baidu.com/item/...https://blog.csdn.net/zw0Pi8G...https://www.jianshu.com/p/143...https://www.jianshu.com/p/843...