美文网首页
nodejs 爬虫实战

nodejs 爬虫实战

作者: 奋斗的小小小兔子 | 来源:发表于2019-04-26 11:12 被阅读0次

    初始化

    合适目录下,新建文件夹nodejs-webcrawler
    打开命令行终端,进入当前目录执行npm init,初始化package.json文件

    安装依赖

    express用来搭建简单的服务器,superagent用来请求页面,cheerio形如jquery处理页面元素

    npm install express -S
    npm install superagent -S
    npm install cheerio -S
    
    

    使用express启动服务器

    在nodejs-webcrawler目录下新建index.js文件
    index.js

    const express = require('express');
    const app = express();
    
    let server = app.listen(3000, function() {
        let { adress, port } = server.address();
        console.log(`App is running at http://${adress}:${port}`); 
    })
    
    app.get('/', async (req, res, next) => {
        res.send('hello World!'); // 输出到浏览器
    })
    
    

    保存!

    打开命令行终端,进入当前目录,
    node index.js

    成功启动服务器

    浏览器打开http://localhost:3000/

    成功输出到浏览器

    访问页面数据

    爬取百度新闻页面(http://news.baidu.com/)

    const accessPage = (url, callback) => {
        // 访问页面
        const superagent = require('superagent');
    
        superagent.get(url).retry(3).end((err, res) => {
            if(err) {
                console.log(`访问页面失败${err}`);
            } else {
                callback && callback(res);
            }
        })
    
    }
    
    

    抓取数据

    const getPageInfo = (res) => {
        // 抓取页面信息
        const cheerio = require('cheerio');
        let hostNews = [];
        // 使用cheerio模块的load()方法,将htmldocument作为参数传入函数,就可以使用类似Jquery的$(selector)的方式获取页面元素
        let $ = cheerio.load(res.text);
    
        $('div#pane-news ul li a').each((idx, ele) => {
            let news = {
                title: $(ele).text(),
                href: $(ele).attr('href'), 
            };
            hostNews.push(news);
        })
        
        return hostNews;
    }
    
    

    保存数据到EXCEl

    1. 保存数据到excel
    const saveToExcel = (ws_data, fileName) => {
        const XLSX = require('xlsx');
        // 保存到excel
        const ws = XLSX.utils.aoa_to_sheet(ws_data);  // sheet data
        let wb = XLSX.utils.book_new();  // 空workbook
        XLSX.utils.book_append_sheet(wb, ws, 'sheet1');  // 将sheet写入workbook
        XLSX.writeFile(wb, fileName);
    }
    
    1. 保存到excel的数据需要特定的格式,接下来格式化数据
    // 原始json数据
    const origin_data = [
    {
       'name' :  'xqq',
       'age':  '20',
    },
    {
       'name' :  'ht',
       'age':  '21',
    },
    ];
    // 保存到excele需要的数据
    const ws_data = [
    ['name','age'],
    ['xqq', '20'],
    ['ht', '22'],
    ];
    
    // 数据格式化的转换函数
    const formatData = (arr) => {
        if(arr.length === 0) {
            return [];
        } 
        let sheetData = [];
        let fields = [];
        Object.keys(arr[0]).forEach(field => {
            fields.push(field);
        })
        arr.forEach(itm => {
            let ele = [];
            fields.forEach(field => {
                ele.push(itm[field]);
            })
            sheetData.push(ele);
        })
        sheetData.unshift(fields);   // 表头放在数组第一位
        return sheetData;
    }
    
    

    声明多个module

    将可公用函数放到统一的地方,声明多个module
    util.js

    const accessPage = (url, callback) => {
        // 访问页面
        const superagent = require('superagent');
    
        superagent.get(url).retry(3).end((err, res) => {
            if(err) {
                console.log(`访问页面失败${err}`);
            } else {
                callback && callback(res);
            }
        })
    
    }
    
    const formatData = (arr) => {
        if(arr.length === 0) {
            return [];
        } 
        let sheetData = [];
        let fields = [];
        Object.keys(arr[0]).forEach(field => {
            fields.push(field);
        })
        arr.forEach(itm => {
            let ele = [];
            fields.forEach(field => {
                ele.push(itm[field]);
            })
            sheetData.push(ele);
        })
        sheetData.unshift(fields);
        return sheetData;
    }
    
    const saveToExcel = (ws_data, fileName) => {
        const XLSX = require('xlsx');
        // 保存到excel
        const ws = XLSX.utils.aoa_to_sheet(ws_data);  // sheet data
        let wb = XLSX.utils.book_new();  // 空workbook
        XLSX.utils.book_append_sheet(wb, ws, 'sheet1');  // 将sheet写入workbook
        XLSX.writeFile(wb, fileName);
    }
    module.exports = {
        accessPage,
        formatData,
        saveToExcel,
    }
    

    主文件index.js

    const express = require('express');
    const app = express();
    const util = require('./util.js');
    
    let server = app.listen(3000, function() {
        let { adress, port } = server.address();
        console.log(`App is running at http://${adress}:${port}`); 
    })
    
    app.get('/', async (req, res, next) => {
        const handleSuccess = (resdom) => {
            let hostNews = getPageInfo(resdom);
            if (hostNews && hostNews.length > 0 ){
                util.saveToExcel(util.formatData(hostNews), 'out.xlsx');
            }
            res.send(hostNews);  // 输出到浏览器中
        }
        util.accessPage('http://news.baidu.com/', handleSuccess);
    
    })
    
    const getPageInfo = (res) => {
        // 抓取页面信息
        const cheerio = require('cheerio');
        let hostNews = [];
        // 使用cheerio模块的load()方法,将htmldocument作为参数传入函数,就可以使用类似Jquery的$(selector)的方式获取页面元素
        let $ = cheerio.load(res.text);
    
        $('div#pane-news ul li a').each((idx, ele) => {
            let news = {
                title: $(ele).text(),
                href: $(ele).attr('href'), 
            };
            hostNews.push(news);
        })
        
        return hostNews;
    }
    
    

    上传到github

    1. 本地文件commit
      当前目录下
    npm init
    git add .
    

    当输入git add .,意识到把node_mdules也上传到暂存区了,需要撤销

    先检查下当前哪些文件已到暂存区

    git status
    
    暂存区文件

    node_modules文件夹下,的确在!!
    输入

    git reset HEAD --  node_modules
    git reset HEAD -- .DS_Store
    

    为了防止不需要的文件上传至github,添加.gitignore文件

    .gitignore文件

    .gitignore文件一并上传

    git add .
    git commit -m 'paichong save to excel'
    
    1. github创建同名repository

      github创建repository
    2. pushgithub
      终端命令行输入

    git remote add origin https://github.com/your_github_address/nodejs-webcrawler.git
    git push origin  master
    
    

    从github下载下来,运行

    npm install
    node index.js
    

    打开http://localhost:3000/查看输出
    查看out.xlsx

    out.xlsx

    github源码地址

    喜欢就star吧

    参考网址
    nodejs写爬虫
    保存数据到excel
    export 多个module
    git撤销

    相关文章

      网友评论

          本文标题:nodejs 爬虫实战

          本文链接:https://www.haomeiwen.com/subject/dzfngqtx.html