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")
        })
    })
    })
}
时间: 2024-12-16 15:25:11

nodejs爬虫案例笔记的相关文章

nodejs爬虫笔记(二)

node爬虫代理设置 最近想爬取YouTube上面的视频信息,利用nodejs爬虫笔记(一)的方法,代码和错误如下 var request = require('request'); var cheerio = require('cheerio');**** var url = 'https://www.youtube.com '; function crawler(url,callback){ var list = []; request(url,function(err,res){ if(e

定向爬虫实战笔记

定向爬虫实战笔记 流程图如下: 来自追女神助手(痴汉)v0.1: 1.#-*-coding:utf8-*-2.3.import smtplib4.from email.mime.text import MIMEText5.import requests6.from lxml import etree7.import os8.import time9.import sys10.reload(sys)11.sys.setdefaultencoding('utf-8')12.13.14.15.clas

windows下《七天学会NodeJS》学习笔记之二--代码的组织和部署

本系列第一篇:<windows下<七天学会NodeJS>学习笔记之一--NodeJS基础>,请参见这儿:http://blog.csdn.net/fm2005/article/details/41348813 模块路径解析规则:nodejs支持三种解析方式:/或C:开头的绝对路径:./开头的绝对路径:按照一定规则解析路径,直到找到模块位置. 内置模块:如果传递给require的是NodeJS内置模块名称,则不解析,直接返回内部模块导出对象. node_modules目录:node_

Nodejs爬虫进阶教程之异步并发控制

Nodejs爬虫进阶教程之异步并发控制 之前写了个现在看来很不完美的小爬虫,很多地方没有处理好,比如说在知乎点开一个问题的时候,它的所有回答并不是全部加载好了的,当你拉到回答的尾部时,点击加载更多,回答才会再加载一部分,所以说如果直接发送一个问题的请求链接,取得的页面是不完整的.还有就是我们通过发送链接下载图片的时候,是一张一张来下的,如果图片数量太多的话,真的是下到你睡完觉它还在下,而且我们用nodejs写的爬虫,却竟然没有用到nodejs最牛逼的异步并发的特性,太浪费了啊. 思路 这次的的爬

NodeJS爬虫系统初探

NodeJS爬虫系统 NodeJS爬虫系统 0. 概论 爬虫是一种自动获取网页内容的程序.是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上是针对爬虫而做出的优化. robots.txt是一个文本文件,robots.txt是一个协议,不是一个命令.robots.txt是爬虫要查看的第一个文件.robots.txt文件告诉爬虫在服务器上什么文件是可以被查看的,搜索机器人就会按照该文件中的内容来确定访问的范围. 一般网站的robots.txt查找方法: 例如www.qq.com http://ww

Nodejs 爬虫简单编写

nodejs 爬虫原理,先用request请求页面内容,把内容获取到并iconv-lite设置编码格式,再用cheerio进行类似dom操作合并内容,转换写入文件中 1)获取单页面数据: var fs = require('fs') var request = require('request') var iconvLite = require('iconv-lite') var cheerio = require('cheerio') //请求 request({ url:'https://g

NodeJS 爬虫爬取LOL英雄联盟的英雄信息,superagent+cheerio+async

1.模块使用 (1)superagent:Nodejs中的http请求库(每个语言都有无数个,java的okhttp,ios的afnetworking) (2)cheerio:Nodejs中的html解析库(每个语言基本都有..) (3)async:Nodejs中的同/异步并发函数执行库(这个非常牛,其他语言同类型的不多) 2.爬取内容 多玩的英雄联盟英雄页面,通过解析页面内每个英雄的URL,然后并发请求英雄的详细数据,提取需要的数据得到结果 http://lol.duowan.com/hero

nodejs 爬虫

参考了各位大大的,然后自己写了个爬虫 用到的modules:utils.js     ---    moment module_url.js var http = require("http");   //获得页面数据 var cheerio = require("cheerio");  //分析页面数据,提取内容 var sanitize = require("validator");   //过滤没用的数据 如空格等 var fs = req

第一个nodejs爬虫:爬取豆瓣电影图片

第一个nodejs爬虫:爬取豆瓣电影图片存入本地: 首先在命令行下 npm install request cheerio express -save; 代码: var http = require('https'); //使用https模块 var fs = require('fs');//文件读写 var cheerio = require('cheerio');//jquery写法获取所得页面dom元素 var request = require('request');//发送reques