一个老同学的故事引发的nodejs 爬虫

栏目: Node.js · 发布时间: 6年前

内容简介:平静悠闲的日子,依然是钱少事多,此处想象一个表情。忽然有一天,故事就来了,一个做统计的美女老同学说她懒得自己复制粘贴,让我帮她爬虫获取一些文章的内容和制定段落的文字,他们做后续的数据统计和分析,这个忙我当然得帮了,虽然没爬过。。。哈哈,然后下班之后我就花了几个小时用自己比较熟悉的nodejs做了这个简单的小Demo(故事会在文末继续并附上老同学美照!:grin:)。爬取该网站(

故事发展

平静悠闲的日子,依然是钱少事多,此处想象一个表情。忽然有一天,故事就来了,一个做统计的美女老同学说她懒得自己复制粘贴,让我帮她爬虫获取一些文章的内容和制定段落的文字,他们做后续的数据统计和分析,这个忙我当然得帮了,虽然没爬过。。。哈哈,然后下班之后我就花了几个小时用自己比较熟悉的nodejs做了这个简单的小Demo(故事会在文末继续并附上老同学美照!:grin:)。

目标:

爬取该网站( wwwn.cdc.gov/nchs/nhanes… )的右侧列表中DocFile下所有的文章的url,然后去爬到每个文章内部的第一段和最后的表格信息,如下图:

一个老同学的故事引发的nodejs 爬虫

下面就是第一篇文章内部第一段,就是我们要爬取内容的一部分,如下:

一个老同学的故事引发的nodejs 爬虫

采用的node包如下:

cheerio

request

也要用到node自带的两个包 http https

var = require('http');

npm init 初始化搭建项目,然后安装npm install cheerio与request ,建立app.js填写代码。

项目目录:

一个老同学的故事引发的nodejs 爬虫

直接上源代码:

var http = require('http');
var https = require('https')
var fs = require('fs');
var cheerio = require('cheerio');
var request = require('request');
var urlHeader = 'https://wwwn.cdc.gov'
var urlFather = 'https://wwwn.cdc.gov/nchs/nhanes/search/datapage.aspx?Component=Laboratory&CycleBeginYear=2013'
//初始url 

let count = 0;
function findUrlList(x,callback){
    https.get(x, function (res) {   
        var html = '';        //用来存储请求网页的整个html内容
        var titles = [];        
        res.setEncoding('utf-8'); //防止中文乱码
        //监听data事件,每次取一块数据
        res.on('data', function (chunk) {   
            html += chunk;
        });
        //监听end事件,如果整个网页内容的html都获取完毕,就执行回调函数
        res.on('end', function () {
         var $ = cheerio.load(html); //采用cheerio模块解析html
         
         var urlArr = [];
         $('#GridView1 tbody tr').each(function (index, item) {
            let url = urlHeader + $(this).children().next().children('a').attr("href")
            startRequest(url)
            urlArr.push(url)
         })
        console.log(urlArr.length)
        callback()
        });

    }).on('error', function (err) {
        console.log(err);
    });
}

function startRequest(x) {
     //采用http模块向服务器发起一次get请求      
     https.get(x, function (res) {   
        var html = '';        //用来存储请求网页的整个html内容
        var titles = [];        
        res.setEncoding('utf-8'); //防止中文乱码
        //监听data事件,每次取一块数据
        res.on('data', function (chunk) {   
            html += chunk;
        });
        //监听end事件,如果整个网页内容的html都获取完毕,就执行回调函数
        res.on('end', function () {
         var $ = cheerio.load(html); //采用cheerio模块解析html
         var news_item = {
            //获取文章的标题
            title: $('div #PageHeader h2').text().trim(),
            url: '文章地址: '+x,
            firstParagraph: '首段:\n'+$('#Component_Description').next().text().trim(),
            codeBookAndFrequencies: '表格信息: \n'+$('#Codebook').children().text().trim()
            };

        savedContent($,news_item);  //存储每篇文章的内容及文章标题
        });

    }).on('error', function (err) {
        console.error(err);
    });

}
//该函数的作用:在本地存储所爬取的新闻内容资源
function savedContent($, news_item) {
    count++;
    let x = '['+count+'] ' + '\n';
    x += news_item.url;
    x = x + '\n'; 
    x += news_item.firstParagraph;
    x = x + '\n'; 
    x += news_item.codeBookAndFrequencies;
    x = x + '\n'; 
    x += '------------------------------------------------------------ \n'; 
    x = x + '\n'; 
    x = x + '\n'; 
    //将新闻文本内容一段一段添加到/data文件夹下,并用新闻的标题来命名文件
    fs.appendFile('./data/' + news_item.title + '.txt', x, 'utf-8', function (err) {
        if (err) {
            console.log(err);
        }
    });
}

// startRequest(url);      //主程序开始运行
findUrlList(urlFather,() => {
    console.log('work done')
})复制代码

命令行 node app.js  跑起来就可看到结果啦!

爬虫txt结果查看:

一个老同学的故事引发的nodejs 爬虫

一个老同学的故事引发的nodejs 爬虫

API参考:

cheerio API: https://cnodejs.org/topic/5203a71844e76d216a727d2e

故事继续

对,我花了两个间断简短的晚上帮她做出来了,然后我发现他想要的不是这样,而是一个更大更多功能的系统,要和他们的R语言系统对接!!!但是又没有经费,哈哈,那故事就这样结束了!但是作为一个很有求知欲的程序君,顺带熟练了一下基本的爬虫,还是很满足的!谢谢阅读,希望能给您一些收获!

美女请收下,你一定不会失望,哈哈哈哈哈:smile:

一个老同学的故事引发的nodejs 爬虫


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

图论导引

图论导引

[美] Douglas B.West / 机械工业出版社 / 2004-10 / 59.00元

图论在计算科学、社会科学和自然科学等各个领域都有广泛应用。本书是本科生或研究生一学期或两学期的图论课程教材。全书力求保持按证明的难度和算法的复杂性循序渐进的风格,使学生能够深入理解书中的内容。书中包括对证明技巧的讨论、1200多道习题、400多幅插图以及许多例题,而且对所有定理都给出了详细完整的证明。虽然本书包括许多算法和应用,但是重点在于理解图论结构和分析图论问题的技巧。一起来看看 《图论导引》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试