网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更常常的称为网页追逐者),是一种按照必定的规则,自动地抓取万维网信息的程序或者脚本。另一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。html
咱们可使用网络爬虫对数据信息进行自动采集,好比应用于搜索引擎中对站点进行爬取收录,应用于数据分析与挖掘中对数据进行采集,应用于金融分析中对金融数据进行采集,除此以外,还能够将网络爬虫应用于舆情监测与分析、目标客户数据的收集等各个领域。前端
网络爬虫按照系统结构和实现技术,大体能够分为如下几种类型:通用网络爬虫(General Purpose Web Crawler)、聚焦网络爬虫(Focused Web Crawler)、增量式网络爬虫(Incremental Web Crawler)、深层网络爬虫(Deep Web Crawler)。 实际的网络爬虫系统一般是几种爬虫技术相结合实现的,下面分别对这几种爬虫加以简单的介绍。node
1.一、通用网络爬虫jquery
又称全网爬虫(Scalable Web Crawler),爬行对象从一些种子URL扩充到整个Web,主要为门户站点搜索引擎和大型Web服务提供商采集数据。
1.二、聚焦网络爬虫git
又称主题网络爬虫(Topical Crawler),是指选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。 和通用网络爬虫相比,聚焦爬虫只须要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也因为数量少而更新快,还能够很好地知足一些特定人群对特定领域信息的需求。
1.三、增量式网络爬虫github
指对已下载网页采起增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它可以在必定程度上保证所爬行的页面是尽量新的页面。。
1.四、深层网络爬虫npm
Web 页面按存在方式能够分为表层网页(Surface Web)和深层网页(Deep Web,也称 Invisible Web Pages 或 Hidden Web)。表层网页是指传统搜索引擎能够索引的页面,以超连接能够到达的静态网页为主构成的Web 页面。Deep Web是那些大部份内容不能经过静态连接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能得到的Web页面。
对以上几种爬虫进行简单的了解后,下面来实现一个简单的爬虫小应用吧。json
2.一、实现目标数组
提到爬虫,大几率会想到大数据,从而又联想到Python,百度了如下,Python作爬虫的确实比较多。因为本身主要作前端开发这块,相对来讲,JavaScript更熟练简单一点。实现一个小目标,那就用NodeJS来对博客园(本身经常使用的一个开发者网站)首页文章列表进行爬取,而后写入到本地JSON文件中。服务器
2.二、环境搭建
NodeJS安装完毕,打开命令行,可用node -v
检测NodeJS是否安装成功,可用npm -v
检测NodeJS是否安装成功,安装成功应该会打印如下信息(因版本不一样而异):
2.三、具体实现
2.3.一、安装依赖包
在目录下执行npm install superagent cheerio --save-dev
安装superagent,cheerio这两个依赖包。建立一个crawler.js文件。
// 导入依赖包 const http = require("http"); const path = require("path"); const url = require("url"); const fs = require("fs"); const superagent = require("superagent"); const cheerio = require("cheerio");
2.3.二、爬取数据
接着get请求页面,在获取到页面内容后,对返回的DOM根据本身想要的数据进行解析取值,最后把处理后的结果JSON转译成字符串保存到本地。
//爬取页面地址 const pageUrl="https://www.cnblogs.com/"; // 解码字符串 function unescapeString(str){ if(!str){ return '' }else{ return unescape(str.replace(/&#x/g,'%u').replace(/;/g,'')); } } // 抓取数据 function fetchData(){ console.log('爬取数据时间节点:',new Date()); superagent.get(pageUrl).end((error,response)=>{ // 页面文档数据 let content=response.text; if(content){ console.log('获取数据成功'); } // 定义一个空数组来接收数据 let result=[]; let $=cheerio.load(content); let postList=$("#main #post_list .post_item"); postList.each((index,value)=>{ let titleLnk=$(value).find('a.titlelnk'); let itemFoot=$(value).find('.post_item_foot'); let title=titleLnk.html(); //标题 let href=titleLnk.attr('href'); //连接 let author=itemFoot.find('a.lightblue').html(); //做者 let headLogo=$(value).find('.post_item_summary a img').attr('src'); //头像 let summary=$(value).find('.post_item_summary').text(); //简介 let postedTime=itemFoot.text().split('发布于 ')[1].substr(0,16); //发布时间 let readNum=itemFoot.text().split('阅读')[1]; //阅读量 readNum=readNum.substr(1,readNum.length-1); title=unescapeString(title); href=unescapeString(href); author=unescapeString(author); headLogo=unescapeString(headLogo); summary=unescapeString(summary); postedTime=unescapeString(postedTime); readNum=unescapeString(readNum); result.push({ index, title, href, author, headLogo, summary, postedTime, readNum }); }); // 数组转换为字符串 result=JSON.stringify(result); // 写入本地cnblogs.json文件中 fs.writeFile("cnblogs.json",result,"utf-8",(err)=>{ // 监听错误,如正常输出,则打印null if(!err){ console.log('写入数据成功'); } }); }); } fetchData();
3.一、生成结果
在项目目录下打开命令行输入node crawler.js
,
会发现目录中会建立一个cnblogs.json
文件,打开文件以下:
打开博客园首页对比下:
发现成功爬到了首页想要的文章列表
3.二、定时爬取
发现只有每执行一次才能获取到数据,价格定时器,让它每隔五分钟自动爬取一次,代码以下:
··· // 每隔5分钟请求一次 setInterval(()=>{ fetchData() },5*60*1000); ···
网络爬虫的应用远远不止这些,以上只是对网络爬虫作了一个简单的介绍,并实现了一个小demo,若有不足,欢迎指正。
参考资料:
https://baike.baidu.com/item/...
https://blog.csdn.net/zw0Pi8G...
https://www.jianshu.com/p/143...
https://www.jianshu.com/p/843...