nodejs抓取动态网页(网络爬虫(webcrawler)、增量式网络机器人(incremental) )
优采云 发布时间: 2022-02-16 02:22nodejs抓取动态网页(网络爬虫(webcrawler)、增量式网络机器人(incremental)
)
前言
?? 网络爬虫(又称网络蜘蛛、网络机器人,在foaf社区,更常称为网页追逐者),是一种按照一定的规则自动爬取万维网上信息的程序或脚本。其他不太常用的名称是 ant、autoindex、emulator 或 worm。
?? 我们可以使用网络爬虫来自动采集的数据信息,比如搜索引擎中的站点收录的爬取,对数据采集的数据分析和挖掘,用于财务分析进行采集在金融数据上,此外,网络爬虫还可用于舆情监测分析、目标*敏*感*词*采集等各个领域。
1、网络爬虫分类
根据系统结构和实现技术,网络爬虫大致可以分为以下几种:通用网络爬虫、聚焦网络爬虫、增量网络爬虫、深度网络爬虫。实际的网络爬虫系统通常是通过几种爬虫技术的组合来实现的。下面简单介绍一下这几种爬虫。
1.1、万能网络爬虫
又称可伸缩网络爬虫,爬取对象从一些*敏*感*词*URL扩展到整个网络,主要针对门户网站搜索引擎和大型网络服务商采集数据。
1.2、关注网络爬虫
话题爬虫也称为话题爬虫,是指选择性地爬取与预定义话题相关的页面的网络爬虫。与一般的网络爬虫相比,专注爬虫只需要爬取主题相关的页面,大大节省了硬件和网络资源,而且由于页面少,保存的页面更新也很快。信息需求。
1.3、增量网络爬虫
指增量更新下载的网页的爬虫,只爬取新生成或更改的网页。可以在一定程度上保证爬取的页面尽可能的新。.
1.4、深网爬虫
网页按存在方式可分为表层网页(surface web)和深层网页(deep web,也称为隐形网页或隐藏网页)。表面网页是指可以被传统搜索引擎检索到的页面,以及主要由可以通过超链接到达的静态网页组成的网页。深网是那些大部分内容无法通过静态链接访问的网页,隐藏在搜索表单后面,只有在用户提交一些 关键词 时才可用。
2、创建一个简单的爬虫应用
?? 简单了解以上爬虫后,我们来实现一个简单的爬虫应用。
2.1、实现目标
说到爬虫,大概率会想到大数据,然后会想到python。百度之后,python的爬虫确实多了。由于我主要做前端开发,所以相对来说javascript更熟练,也更简单。实现一个小目标,然后用nodejs爬取首页文章列表(自己常用的一个开发者网站),然后写入本地json文件。
2.2、环境建设
nodejs安装好后,打开命令行,使用node -v查看nodejs是否安装成功,使用npm -v查看nodejs是否安装成功,如果安装成功应该打印如下信息(不同版本不同):
2.3、具体实现
2.3.1、安装依赖
在目录下执行 npm install superagentcheerio --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.2、爬取数据
然后获取请求页面,获取页面内容后,根据你想要的数据解析返回的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 //链接
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);
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、执行优化
3.1、生成结果
在项目目录下打开命令行,输入node crawler.js,
你会发现目录下会创建一个cnblogs.json文件,打开文件如下: