本文主要介绍node.js作为一个简单的爬虫案例教程。本文通过一个简单的案例来说明对这项技术的理解和使用。以下是详细内容,有需要的朋友可以参考一下。
准备工作
首先你需要下载nodejs,应该没问题。
原文需要下载webstrom,我电脑上已经有了,不需要下载。完全可以在命令行操作。
创建工程
准备工作完成后,我们将开始创建项目。
首先,创建一个要存放资源的文件夹。比如我在E盘创建了一个myStudyNodejs的文件夹。
如图所示,在命令行中输入您创建的文件夹。
输入磁盘e: e:
转到文件夹:cd myStudyNodejs(您创建的文件夹的名称)
注意所有的英文符号。
初始化项目,在您创建的文件夹下运行npm init初始化项目。
一路回到车上,最后输了个是。
运行后,文件夹中会生成一个package.json文件,其中包含项目的一些基本信息。
安装所需的软件包
在创建的文件夹的目录下运行。
npm安装cheerio保存
npm安装请求-保存
想爬武大,这两个包就够了。如果你想攀登曹流,你需要一个额外的转换代码包。windows是如下的
npm安装iconv-lite-保存
Mac是npm安装iconv -save。
结果第二张图应该是这样运行的,中间少了一个字母。
创建文件
在您为保存已爬网文本数据而创建的文件夹下创建一个数据文件夹。
创建一个图像文件夹来保存图像数据。
为编写程序创建一个js文件。像study.js(创建一个记事本文件来改。发短信给。js)
解释save的目的是将项目对这个包的依赖关系写入package.json文件。
武大计算机学院新闻爬虫代码
下面是武汉大学计算机学院新闻的爬虫代码。将其复制到创建的。js文件并保存它。
var http=require(' http ');
var fs=require(' fs ');
var cheerio=require(' cheerio ');
var request=require(' request ');
var I=0;
//初始url
var URL=' http://cs . whu . edu . cn/a/xinwendongtaifabu/2018/0428/7053 . html ';
函数fetchPage(x) {//封装了一层函数。
start request(x);
}
函数startRequest(x) {
//使用http模块向服务器发起get请求。
http.get(x,function (res) {
var html=“”;//用于存储所请求网页的整个html内容
var titles=[];
RES . set encoding(' utf-8 ');//防止中文乱码
//监听数据事件,一次取一条数据。
res.on('data ',function (chunk) {
html=chunk
});
//监听结束事件,如果获取了整个网页内容的html,则执行回调函数。
res.on('end ',function () {
var $=cheerio . load(html);//用cheerio模块解析html
var news_item={
//获取文章的标题
标题:$('div#container dt ')。文本()。trim(),
i: i=i 1,
};
console . log(news _ item);//打印新闻信息
var news _ title=$(' div # container dt ')。文本()。trim();
savedContent($,news _ title);//存储每篇文章的内容和标题。
savedImg($,news _ title);//存储每篇文章的图片和图片标题
//下一篇文章的url
var nextLink=' http://cs . whu . edu . cn ' $(' DD。寻呼a’)。attr(' href ');
str 1=next link . split('-');//去掉网址后面的中文
str=encodeURI(str 1[0]);
//这是亮点之一。通过控制I,可以控制抓取多少文章。武大只有8篇,所以设为8。
如果(i=8) {
fetch page(str);
}
});
}).on('error ',function (err) {
console . log(err);
});
}
//该函数用于将抓取的新闻内容资源保存在本地。
函数savedContent($,news_title) {
$('dd.info ')。每个(函数(索引,项目){
var x=$(这个)。text();
var y=x.substring(0,2).trim();
if (y=='') {
x=x ' \ n
//将新闻文本内容一段一段添加到/数据文件夹下,并用新闻的标题来命名文件
fs.appendFile(' ./data/'新闻标题' .' txt ',x,' utf-8 ',函数(错误){
如果(错误){
控制台。日志(错误);
}
});
}
})
}
//该函数的作用:在本地存储所爬取到的图片资源
函数savedImg($,news_title) {
$('dd.info img ').每个(函数(索引,项目){
var img_title=$(this).父级()。下一个()。文本()。trim();//获取图片的标题
if(img _ title。长度35 | | img _ title==' '){
img _ title=' Null
}
var img_filename=img_title ' .jpg ';
var img _ src=' http://cs。whu。edu。' cn ' $(这个)。attr(' src ');//获取图片的全球资源定位器(统一资源定位器)
//采用请求模块,向服务器发起一次请求,获取图片资源
request.head(img_src,function(err,res,body){
如果(错误){
控制台。日志(错误);
}
});
请求(img_src).管道(fs.createWriteStream(' ./image/' news _ title '-' img _ filename));//通过流的方式,把图片写到本地/图片目录下,并用新闻的标题和图片的标题作为图片的名称。
})
}
获取页面(URL);//主程序开始运行
下面就是激动人心的时刻了,在当前文件夹下面,运行创建的射流研究…文件,比如我的是news.js
npm新闻。射流研究…
文本资源:
图片资源:
草榴技术讨论区爬虫
爬完武大的新闻并不过瘾,于是尝试了一波爬草榴的技术讨论区(当然也能爬一些你懂的)。其中遇到了一些问题。
爬草榴的时候,发送超文本传送协议(超文本传输协议的缩写)请求报文头里面需要包含用户代理字段,于是需要把初始全球资源定位器(统一资源定位器)做如下改变
var url={
主机名:“cl.5fy.xyz”,
路径:'/thread0806.php?fid=7 ',
标题:{
内容类型':'文本/html ',
//没有这个字段的话访问不了
用户代理:' Mozilla/5.0(Windows NT 6.3;WOW64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/46。0 .2490 .86 Safari/537.36 ',
}};
其次,节点只支持抓取utf-8字符编码的网站,所以需要安装额外的包来转换编码,所以修改代码如下
/*
* @作者:用户
* @日期:2018-04-28 19:34:50
* @最后修改者:用户
* @最后修改时间:2018-04-30 21:35:26
*/
var http=require(' http ');
var fs=require(' fs ');
var cheerio=require(' cheerio ');
var request=require(' request ');
var iconv=require(' iconv-lite ');
var I=0;
//用来判断存储还是访问
var temp=0;
设起始页=3;//从哪一页开始爬
let page=startPage
设end page=5;//爬到哪一页
设搜索文本=" ";//爬取的关键字,默认全部爬取,根据自己需要
//初始全球资源定位器(统一资源定位器)
var url={
主机名:" 1024liuyouba.tk ",
路径:'/thread0806.php?fid=16' 'search=page=' startPage,
标题:{
内容类型':'文本/html ',
//没有这个字段的话访问不了
用户代理:' Mozilla/5.0(Windows NT 6.3;WOW64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/46。0 .2490 .86 Safari/537.36 ',
}};
//存储首页全球资源定位器(统一资源定位器)
URL列表=[];
//封装了一层函数
函数提取页面(十){
setTimeout(function(){
开始请求(x);},5000)
}
//首先存储要访问界面的全球资源定位器(统一资源定位器)
函数getUrl(x){
温度;
http.get(x,function(res){
var html=
RES . set编码(“二进制”);
res.on('data ',function (chunk) {
html=块
});
res.on('end ',function () {
var buf=new Buffer(html,' binary ');
var str=iconv.decode(buf,' GBK ');
var $=cheerio。负载(str);//采用再见模块解析超文本标记语言
$('tr.tr3 td.tal h3 a ').each(function(){
var search=$(这个)。text();
如果(搜索。(搜索文本)=0的索引){
var nextLink=' http://cl。5fy。XYZ/' $(这个)。attr(' href ');
str 1=下一个链接。拆分('-');//去除掉全球资源定位器(统一资源定位器)后面的中文
str=encodeURI(str 1[0]);
URL列表。push(str);}
})
页面;
if(pageendPage){
//存储下一页全球资源定位器(统一资源定位器)
x.path='/thread0806.php?fid=16' 'search=page=' page,
getUrl(x);
}else if(urlList.length!=0){
获取页面(URL列表。shift());
}否则{
console.log('未查询到关键字!');
}
})
}).on('error ',function (err) {
控制台。日志(错误);
});
}
函数startRequest(x) {
if(temp===0){
getUrl(x);
}
否则{
//采用超文本传送协议(超文本传输协议的缩写)模块向服务器发起一次得到请求
http.get(x,function (res) {
var html=//用来存储请求网页的整个超文本标记语言内容
RES . set编码(“二进制”);
var titles=[];
//监听数据事件,每次取一块数据
res.on('data ',function (chunk) {
html=块
});
//监听结束事件,如果整个网页内容的超文本标记语言都获取完毕,就执行回调函数
res.on('end ',function () {
var buf=new Buffer(html,' binary ');
var str=iconv.decode(buf,' GBK ');
var $=cheerio。负载(str);//采用再见模块解析超文本标记语言
var news_item={
//获取文章的标题
标题:$('h4 ').文本()。trim(),
//我是用来判断获取了多少篇文章
i: i=i 1,
};
控制台。日志(news _ item);//打印信息
var news_title=$('h4 ').文本()。trim();
savedContent($,news _ title);//存储每篇文章的内容及文章标题
savedImg($,news _ title);//存储每篇文章的图片及图片标题
//如果没访问完继续访问
if (urlList.length!=0 ) {
获取页面(URL列表。shift());
}
});
}).on('error ',function (err) {
控制台。日志(错误);
});
}
}
//该函数的作用:在本地存储所爬取的文本内容资源
函数savedContent($,news_title) {
$('div.t2[style].TPC _内容。不要抓’).每个(函数(索引,项目){
var x=$(这个)。text();
x=x ' \ n
//将新闻文本内容一段一段添加到/数据文件夹下,并用新闻的标题来命名文件
fs.appendFile(' ./data/'新闻标题' .' txt ',x,' utf-8 ',函数(错误){
如果(错误){
控制台。日志(错误);
}
});
})
}
//该函数的作用:在本地存储所爬取到的图片资源
函数savedImg($,news_title) {
//创建文件夹
fs.mkdir(' ./image/'新闻标题,函数(错误){
if(err){console.log(err)}
});
$('.tpc_content.do_not_catch输入[src]').每个(函数(索引,项目){
var img _ title=index//给每张图片附加一个编号
var img_filename=img_title ' .jpg ';
var img_src=$(this).attr(' src ');//获取图片的全球资源定位器(统一资源定位器)
//采用请求模块,向服务器发起一次请求,获取图片资源
request.head(img_src,function(err,res,body){
如果(错误){
控制台。日志(错误);
}
});
setTimeout(function(){
请求({uri: img_src,编码:' binary'},函数(错误,响应,正文){
如果(!错误响应。状态码==200) {
fs.writeFile(' ./image/' news _ title '/' img _ filename,body,' binary ',function (err) {
if(err){console.log(err)}
});
}
})
});
})
}
获取页面(URL);//主程序开始运行
成果展示:
到此这篇关于节点。射流研究…做一个简单的爬虫案例教程的文章就介绍到这了,更多相关节点。射流研究…做一个简单的爬虫内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。