nodejs爬虫案例笔记
用nodeJs制作一个简单的网页爬虫
主要分为三个步骤,向目标请求数据,处理数据,打印数据。需要用到的模块有http,cheerio。
1.准备步骤,引入要使用的模块
2.向目标请求数据
http.get(url,function(res){
var html='';
res.on("data",function(data){
html+=data;
})
res.on("end",function(){
var couseData=filterChapter(html);//处理
printcouse(couseData);//打印
})
}).on("error",function(){
console.log("something is error")
})
知识点:res服务器响应有两个事件,data事件是数据传输时触发,如果数据量比较大的话,会将数据分为小段小段的接受,每次都会触发data事件。end事件,所有数据接受完毕时触发。
3.处理数据
function filterChapter(html){
var $=cheerio.load(html);
var chapters=$(".chapter");
var couseData=[];
chapters.each(function(){
var chapter=$(this);
var chapterTil=chapter.find("strong").text();
var chapterCon=chapter.find(".video").children("li");
var chapterData={
chapterTil:chapterTil,
chapterCon:[]
}
chapterCon.each(function(){
var chapterDetail=$(this).find(".studyvideo");
var chapterDetailTil=chapterDetail.text();
var id=chapterDetail.attr("href").split("video/")[1];
chapterData.chapterCon.push({
title:chapterDetailTil,
id:id
})
})
couseData.push(chapterData)
})
return couseData;
}
知识点:cheerio模块几乎能够解析任何的 HTML 和 XML document,并用jquery来进行dom操作。它为服务器特别定制的,快速、灵活、实施的jQuery核心实现。
在这里是要找到课程章节名称及子栏目
4.打印数据
function printcouse(couseData){
couseData.forEach(function(item){
chapterTil=item.chapterTil;
console.log(chapterTil+"\n");
item.chapterCon.forEach(function(chapterDetail){
console.log(chapterDetail.id+chapterDetail.title+"\n")
})
})
}
以上只能抓取一个页面的课程数据,接下来是要在此基础上抓取多个页面的数据。
增加模块promise
1.对请求数据部分的处理,改成返回一个promise对象,方便后续的并发控制
function getPageAsync(url){
return new Promise(function(resolve,reject){
console.log("正在爬取课程")
http.get(url,function(res){
var html='';
res.on("data",function(data){
html+=data;
})
res.on("end",function(){
resolve(html)//resolve就是promise对象接下来要回调的函数
})
}).on("error",function(e){
reject(e)
console.log("something is error")
})
})
}
2.根据不同的url返回promise对象,将他们都放到数组里面
var videoIds=[348,259,197,75];
var fetchCouseArr=[];//promiser对象数组
videoIds.forEach(function(id){
fetchCouseArr.push(getPageAsync(baseUrl+id))//存入数组
})
3.并发控制,同时抓取多个页面数组
Promise
.all(fetchCouseArr)//all方法接受一个数组,返回多个promise对象,每个promise对象都执行接下来的操作
.then(function(pages){//pages就是每个要去爬的页面
var cousesData=[] pages.forEach(function(pages){
var courses=filterChapter(pages)//数据处理 cousesData.push(courses)
}) cousesData.sort(function(a,b){
return a.number<b.number
}) printcouse(cousesData)//数据打印
})
知识点:promise的all方法接受一个数组参数,对于数组内的每个promise对象都执行接下来的操作,上面请求数据时最后返回的reslove(html)在这里就是then方法内的回调函数,pages参数就是请求到的html数据。
4.数据处理和数据打印原理还是和最开始一样
function filterChapter(html){
var $=cheerio.load(html);
var Title=$("#main .path>a").eq(3).children("span").text();
var number=parseInt($(".meta-value").eq(2).children("strong").text(),10);
var couseData={
Title:Title,
videos:[],
number:number
};
var chapters=$(".chapter");
chapters.each(function(){
var chapter=$(this);
var chapterTil=chapter.find("strong").text();
var chapterCon=chapter.find(".video").children("li");
var chapterData={
chapterTil:chapterTil,
chapterCon:[]
}
chapterCon.each(function(){
var chapterDetail=$(this).find(".studyvideo");
var chapterDetailTil=chapterDetail.text();
var id=chapterDetail.attr("href").split("video/")[1];
chapterData.chapterCon.push({
title:chapterDetailTil,
id:id
})
})
couseData.videos.push(chapterData)
})
return couseData;
}
function printcouse(cousesData){
cousesData.forEach(function(courseData){
console.log(courseData.number+'人学过'+courseData.Title+'\n')
})
cousesData.forEach(function(courseData){
console.log('###'+courseData.Title+'\n')
courseData.videos.forEach(function(item)
{
//console.log('###'+item.chapterTil+'\n')
var chapterTil=item.chapterTil;
console.log(chapterTil+"\n");
item.chapterCon.forEach(function(chapterDetail){
console.log(chapterDetail.id+chapterDetail.title+"\n")
})
})
})
}
nodejs爬虫案例笔记的更多相关文章
- nodejs爬虫笔记(三)---爬取YouTube网站上的视频信息
思路:通过笔记(二)中代理的设置,已经可以对YouTube的信息进行爬取了,这几天想着爬取网站下的视频信息.通过分析YouTube,发现可以从订阅号入手,先选择几个订阅号,然后爬取订阅号里面的视频分类 ...
- nodejs爬虫笔记(二)---代理设置
node爬虫代理设置 最近想爬取YouTube上面的视频信息,利用nodejs爬虫笔记(一)的方法,代码和错误如下 var request = require('request'); var chee ...
- nodejs爬虫--抓取CSDN某用户全部文章
最近正在学习node.js,就像搞一些东西来玩玩,于是这个简单的爬虫就诞生了. 准备工作 node.js爬虫肯定要先安装node.js环境 创建一个文件夹 在该文件夹打开命令行,执行npm init初 ...
- NodeJS 爬虫爬取LOL英雄联盟的英雄信息,批量下载英雄壁纸
工欲善其事,必先利其器,会用各种模块非常重要. 1.模块使用 (1)superagent:Nodejs中的http请求库(每个语言都有无数个,java的okhttp,OC的afnetworking) ...
- Nodejs爬虫进阶教程之异步并发控制
Nodejs爬虫进阶教程之异步并发控制 之前写了个现在看来很不完美的小爬虫,很多地方没有处理好,比如说在知乎点开一个问题的时候,它的所有回答并不是全部加载好了的,当你拉到回答的尾部时,点击加载更多,回 ...
- NodeJS爬虫系统初探
NodeJS爬虫系统 NodeJS爬虫系统 0. 概论 爬虫是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上是针对爬虫而做出的优化. robots.txt是一个文本文 ...
- 关于Python网络爬虫实战笔记③
Python网络爬虫实战笔记③如何下载韩寒博客文章 Python网络爬虫实战笔记③如何下载韩寒博客文章 target:下载全部的文章 1. 博客列表页面规则 也就是, http://blog.sina ...
- python网络爬虫学习笔记
python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...
- nodejs爬虫——汽车之家所有车型数据
应用介绍 项目Github地址:https://github.com/iNuanfeng/node-spider/ nodejs爬虫,爬取汽车之家(http://www.autohome.com.cn ...
随机推荐
- github新建远程仓库初始化记录
…or create a new repository on the command line echo "# 输出内容" >> README.md git init ...
- 3_PHP表达式_1_常量
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP常量分为自定义常量与预定义常量. 1.自定义常量 在使用前必须先定义,PHP的define()函数专门用于定 ...
- 总结一下几个for循环常见用法和区别
1.for循环//有人喜欢使用一个临时变量把长度缓存起来,说是数据量大时效果更好(我本人没有去验证) for(j = 0,len=arr.length; j < len; j++) { //执行 ...
- 常见的CSS样式
常见的css样式 color 文字颜色 background-color 背景颜色 opacity 设置透明度 颜色: 光的三原色: 红 绿 蓝 三种颜色表示法: 名词表示法: red green b ...
- JVM锁优化以及区别
偏向所锁,轻量级锁都是乐观锁,重量级锁是悲观锁. 首先简单说下先偏向锁.轻量级锁.重量级锁三者各自的应用场景: 偏向锁:只有一个线程进入临界区: 轻量级锁:多个线程交替进入临界区: 重量级锁:多个线程 ...
- TCP与UDP协议必知必会
TCP协议 一个工作在传输层的传输控制协议,面向连接.可靠的流式协议,HTTP协议建立在TCP基础上.每个TCP报文,实际在网络层进行封装成IP数据报,会进行IP分片(受限于MTU). 头部(20字节 ...
- Vue路由规则中定义参数
Vue使用routerLinke定义参数的时候 路由规则中不需要更改任何属性. 路由其实就是我们在html中定义的锚点,点击这个连接跳转一个锚点.vue中的路由也是这个原理, 前提是路由必须创建在实 ...
- LNMP环境搭建BBS论坛及伪静态
我们在mysql备份 LNMP环境中的数据库迁移为独立的服务器的基础上搭建BBS论坛: [root@bqh-117 ~]# mysql -uroot -p123456 Welcome to the ...
- django 配置文件settings.py 设置模板
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'dj ...
- Arduino Tian开发板:一个功能强大的天气预报中心
每天都在出现新的连接设备. Arduino携手云平台一起加入这场战斗,于是出现了一个新的挑战者 - Arduino Tian! 使用python和经典Arduino框架,本教程将引导您将您的Ardui ...