nodejs入门之小爬虫

一、爬虫概念:

网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

二、基于https 模块实现爬取网页信息

// 1、引入hhtps模块
const https = require('https’)//1.1引入cheerio
const cheerio = require('cheerio’)//2、定义一个请求地址
const url = 'https://www.xxxxxx.com/‘;

https.get(url,(res) => {
	//res是响应对象,我们需要的响应体
	let html = ‘';
	//监听res data事件,响应传输过程中可能会触发多次
	res.on('data',(chunk) => {
	    html += chunk;
	})//监听res end事件,响应体传输完成时触发
	res.on('end',() => {
	    findMenu(html)})
})

const findMenu = (htmlStr) => {
    //1.使用cheerio装载
    var $ = cheerio.load(htmlStr)var $menuMain = $('.menu_main’)// 2.定义一个接收最终结果的数组
    var result = []//3.查找元素
    $menuMain.each((index,item) => {
        var obj = {}var name = $(item).find('h2').text().trim()//console.log(name)
        obj.name = name
        //3.2定义一个存放接收当前大类的二级分类的数组
        obj.subname = []var $as = $(item).find('a’)//3.2循环取出subname
        $as.each((i, aE1) => {
            var aText = $(aE1).text().trim();
            obj.subname.push(aText)})
        result.push(obj)})
    console.log(result)}

最后爬取结果:

[ { name: '技术', subname: [ 'Java', 'PHP', 'C++', '区块链', 'Android', 'iOS', '数据挖掘', '深度学习', '自然语言处理', '机器学习', '测试', 'html5', '技术总监', '架构师', 'CTO' ] },
{ name: '产品', subname: [ '产品总监', '产品经理', '数据产品经理', '游戏策划' ] },
{ name: '设计', subname: [ 'UI设计师', '交互设计', '网页设计师', '平面设计师', '视觉设计师' ] },
{ name: '运营', subname: [ '新媒体运营', '编辑', '数据运营', '运营总监', 'COO' ] },
{ name: '市场', subname: [ '市场营销', '市场推广', '市场策划', '政府关系', '广告文案', '广告投放', '市场推广', 'SEO', 'SEM' ] },
{ name: '销售', subname: [ '销售专员', '销售经理', '销售总监', '大客户代表', '客户经理', '电话销售' ] },
{ name: '职能', subname: [ 'HR', '行政', '财务', '审计' ] },
{ name: '游戏', subname: [ '小游戏开发', 'U3D', '游戏策划', '游戏运营', '剧情设计', '游戏动画', '游戏原画', '游戏运营', '手游推广', '游戏主播', '游戏陪练' ] } ]

三、cheerio 第三方模块

简单理解为是使用在服务器端的 jquery。保留了 jquery 选择器的相关功能,去掉了 DOM 操作功能。

1.安装模块

$ npm install cheerio;

2.引入

const cheerio = require('cheerio’)

3.使用cheerio.load( )装载html字符集,得到一个cheerio对象

const $ = cheerio.load(htmlStr)

4.1 各种类似操作jquery,获取html字符集中h1元素text内容

console.log($(“h1”).tetx())

4.2 给h1元素加个class .class 名为hello

$(“h1”).addClass(“hello”)

4.3 输出html字符串内容

console.log($.html())

接下来再来举个栗子:

从直播网站拉取当时未进直播间人数,未进直播间列表

//引入 http 模块
const http = require('http');
//引入 cheerio
const cheerio = require('cheerio');
//请求的路径
const url = "http://www.yyyyyy.com;

http.get(url,(res) => {
    let raw = ‘';
    //监听res data事件,响应传输过程中可能会触发多次
    res.on('data',(chunk) => {
        raw += chunk;
    });
    //监听res end事件,响应体传输完成时触发
    res.on('end',() => {
        console.log(raw);
    findTbody(raw);
    })
})

const findTbody = (htmlStr) => {
    //1.使用cheerio装载    
    const $ = cheerio.load(htmlStr);
    // 2.定义一个接收最终结果的数组
    let result = [];
    let count = [];
    let nameList = [];
    $('tbody tr').each((index,item) => {
        //过滤掉第一列 列头    
        if(index > 0){
            //总人数
            count++;
            //获取第一个单元格元素
            let oTd1 = $(item).find('td').eq(0);
            //获取第二个单元格元素
            let oTd2 = $(item).find('td').eq(1);
            //拼接成想要的格式  深圳-李淑琳
            var names = $(oTd1).text() + "-" + $(oTd2).text();
            //装进数组
            nameList.push(names);
        }
        result = {
            count:count,
            names:nameList
        }
    })
    var date = new Date();
    var currentTime = date.toLocaleString();
    console.log(`[${currentTime}`);
    console.log("未进直播间人数:" + result.count);
    console.log("未进直播间列表:" + result.names);
}

你可能感兴趣的:(nodejs入门之小爬虫)