内容简介:平静悠闲的日子,依然是钱少事多,此处想象一个表情。忽然有一天,故事就来了,一个做统计的美女老同学说她懒得自己复制粘贴,让我帮她爬虫获取一些文章的内容和制定段落的文字,他们做后续的数据统计和分析,这个忙我当然得帮了,虽然没爬过。。。哈哈,然后下班之后我就花了几个小时用自己比较熟悉的nodejs做了这个简单的小Demo(故事会在文末继续并附上老同学美照!:grin:)。爬取该网站(
故事发展
平静悠闲的日子,依然是钱少事多,此处想象一个表情。忽然有一天,故事就来了,一个做统计的美女老同学说她懒得自己复制粘贴,让我帮她爬虫获取一些文章的内容和制定段落的文字,他们做后续的数据统计和分析,这个忙我当然得帮了,虽然没爬过。。。哈哈,然后下班之后我就花了几个小时用自己比较熟悉的nodejs做了这个简单的小Demo(故事会在文末继续并附上老同学美照!:grin:)。
目标:
爬取该网站( wwwn.cdc.gov/nchs/nhanes… )的右侧列表中DocFile下所有的文章的url,然后去爬到每个文章内部的第一段和最后的表格信息,如下图:
下面就是第一篇文章内部第一段,就是我们要爬取内容的一部分,如下:
采用的node包如下:
cheerio
request
也要用到node自带的两个包 http https
var = require('http');
npm init 初始化搭建项目,然后安装npm install cheerio与request ,建立app.js填写代码。
项目目录:
直接上源代码:
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结果查看:
API参考:
cheerio API: https://cnodejs.org/topic/5203a71844e76d216a727d2e
故事继续
对,我花了两个间断简短的晚上帮她做出来了,然后我发现他想要的不是这样,而是一个更大更多功能的系统,要和他们的R语言系统对接!!!但是又没有经费,哈哈,那故事就这样结束了!但是作为一个很有求知欲的程序君,顺带熟练了一下基本的爬虫,还是很满足的!谢谢阅读,希望能给您一些收获!
美女请收下,你一定不会失望,哈哈哈哈哈:smile:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。