一個老同窗的故事引起的nodejs 爬蟲

    故事發展

       平靜清閒的日子,依然是錢少事多,此處想象一個表情。突然有一天,故事就來了,一個作統計的美女老同窗說她懶得本身複製粘貼,讓我幫她爬蟲獲取一些文章的內容和制定段落的文字,他們作後續的數據統計和分析,這個忙我固然得幫了,雖然沒爬過。。。哈哈,而後下班以後我就花了幾個小時用本身比較熟悉的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

採用的node包以下:

cheerio
也要用到node自帶的兩個包 http https
var = require('http');
var = require('https')


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

爬蟲txt結果查看:




API參考:


故事繼續

       對,我花了兩個間斷簡短的晚上幫她作出來了,而後我發現他想要的不是這樣,而是一個更大更多功能的系統,要和他們的R語言系統對接!!!可是又沒有經費,哈哈,那故事就這樣結束了!可是做爲一個頗有求知慾的程序君,順帶熟練了一下基本的爬蟲,仍是很知足的!謝謝閱讀,但願能給您一些收穫!函數

美女請收下,你必定不會失望,哈哈哈哈哈😄工具

相關文章
相關標籤/搜索