平靜清閒的日子,依然是錢少事多,此處想象一個表情。突然有一天,故事就來了,一個作統計的美女老同窗說她懶得本身複製粘貼,讓我幫她爬蟲獲取一些文章的內容和制定段落的文字,他們作後續的數據統計和分析,這個忙我固然得幫了,雖然沒爬過。。。哈哈,而後下班以後我就花了幾個小時用本身比較熟悉的nodejs作了這個簡單的小Demo(故事會在文末繼續並附上老同窗美照!😁)。html
爬取該網站(wwwn.cdc.gov/nchs/nhanes…)的右側列表中DocFile下全部的文章的url,而後去爬到每一個文章內部的第一段和最後的表格信息,以下圖:node
(2018.08.31補充)npm
打開要爬去的主頁,右鍵Doc File下面的某一篇文檔,選擇「檢查」可在瀏覽器開發者工具(windows 按F12可直接打開)中,Element下可看到文檔的url地址和整個頁面的DOM結構。windows
採用相同的方法,能夠打開其中一篇文章,在文章要爬去的位置右鍵,查看到文章的Dom結構,獲取到其中內容。瀏覽器
定位到文檔所在Table---Table下的Doc File---取出Doc File下的文章url---根據url獲取文章內容---選擇文章內咱們要爬去的內容所在DOM---格式化處理並保存在txt中。bash
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 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 跑起來就可看到結果啦!app
對,我花了兩個間斷簡短的晚上幫她作出來了,而後我發現他想要的不是這樣,而是一個更大更多功能的系統,要和他們的R語言系統對接!!!可是又沒有經費,哈哈,那故事就這樣結束了!可是做爲一個頗有求知慾的程序君,順帶熟練了一下基本的爬蟲,仍是很知足的!謝謝閱讀,但願能給您一些收穫!函數
美女請收下,你必定不會失望,哈哈哈哈哈😄工具