Node.js 薄荷網爬取

Node.js:是一個基於前端的服務器,主要的特色:單線程,異步I/O(對這個沒有了解,開發起來真的會踩不少坑),事件驅動html

前言:本人主要是一個以使用.Net平臺下的語言,進行開發的一個菜雞,以前面試這家公司的時候,面試官問我一個問題給你一個頁面裏面有十頁的分頁數據,你能使用什麼技術將這些數據所有抓取出來。對於當時剛畢業的我聽到這個問題,內心一下想到python(對它沒有任何的瞭解,我覺得python只是用來作數據挖掘的,對這門語言徹底沒了解過貿然吹牛感受會被打臉),而後我尷尬的說了句在網頁控制檯裏使用jquery或者js,抓當前頁的數據(只是在控制檯裏展現出來,還不能入庫),面試官聽到這個回答,我只看到了他嘴角上揚了一下,可是最後竟然仍是奇蹟般的經過了面試,進入了這家公司直到如今,很是感恩此次機會,算是讓我正式步入了IT這個行業,成爲一名專業的編程人員吧。前端

以後我嘗試過使用c#的WebBrowser對象,Python的HTMLSession包來抓這個薄荷網的數據,最後在對比的時候仍是以爲Node.js(異步搞清楚以後)好使,在Node.js裏那些已經被大神們封裝好的包,直接拿來使用就行,幾乎只須要一點點的HTML層級結構知識,一點jQuery選擇器知識差很少就能將整個網頁的數據進行爬取了。node

 

薄荷網地址:http://www.boohee.com/food/,這個網站的 熱量查詢板塊 很是適合拿來練手( 仍是程序員本身人坑本身人呀!哈哈哈哈哈,仍是給人家打一波廣告吧,雖然沒什麼流量,哈哈哈哈)    薄荷 減肥健身 掌控人生 專業的在線體重管理平臺 強大的食品養分數據庫  
python

 

抓取接口使用python的requests包進行抓取數據較好,在接口數據返回以後,會自動將數據轉換爲元組類型,在c#中須要手段將數據轉換爲JObject 而後再對應進行取值jquery

抓取web網頁數據用nodejs較好,使用cheerio包能夠直接將獲取到的web頁面進行 jQuery 語法操做獲取個性化數據git

 

源碼程序員

    GitHub:https://github.com/loyking/NodeJs.gitgithub

下載包語法:web

npm install packagename

須要導入的包: var http = require("http"), //http協議請求面試

 

url = require("url"), //url地址
sql = require("mssql"), //數據庫操做
express = require("express"), //框架
superagent = require("superagent"), //網絡請求(注意:沒有鏈接網絡,則請求不了網頁
eventproxy = require("eventproxy"), //異步回調
cheerio = require("cheerio"), //node.js中的jquery庫
uuid = require("uuid/v4"), //v1:產生時間戳的uuid    使用的數據庫爲SQL server2017版,表中定義的主鍵類型爲uniqueidentifier,在nodejs中對應的則是uuid
async = require("async") //異步

 

目標:將熱量查詢板塊 =》 薄荷食物庫 =》 每一個分類中的食物名稱、熱量、評價.....等等相關數據進行爬取(畫的有點醜)

 

 

首先進去以後就能看到以下板塊了,一共是11個板塊分類(圖沒有截全請不要介意.........)

 

 

 咱們如今須要作的第一步就是對這個頁面的層級結構進行分析一波,獲得咱們想要的數據(每一個分類板塊的url地址),按下F12鍵打開 開發者工具 查看一下這些分類的層級結構 就是以下圖了,咱們須要的一級數據(對數據進行一個排序,從父級(分類板塊)開始)就是那個a表的href屬性了

而後它的層級結構是(咱們用jquery選擇器來作實例,cheerio包是支持這種jq語法的)

$("#main .container ul[class='row'] li div[class='text-box'] h3 a").attr('href') 其實根本不須要寫的這麼複雜,這裏只是讓你們對這個層級有一個清晰的瞭解

因爲咱們取到的是對應的分類路徑沒有帶域名的,因此咱們等下在程序中是須要定義一個常量來保存域名信息,而後對獲取到的href進行字符拼接

 

 

我使用的是Windows下的環境,啓動程序以後,控制檯進行輸出全部的分類url(每一個食品分類板塊的url)

  

 

對分類url進行循環遍歷,獲得全部該板塊下全部的食物信息

 

根據當前板塊的url獲得全部的食品url信息,根據html層級結構佈局來看想要獲得全部的食品信息是確定須要使用循環遍歷的

首先獲得該食品連接的a標籤:$("div[class='img-box pull-left'] a[target='_blank']") ,進行遍歷循環而後再單個元素進行attr("href")取得屬性值

 

 而後將全部的a標籤的href屬性進行輸出獲得以下圖信息(在異步的執行中可能不是按照原有頁面排版的順序進行輸出)

 

獲得全部的食物url後就能直接請求頁面抓取咱們想要的數據了

 

 

 

具體內部實現可從GitHub上覆制源碼下載至本地閱讀,抓取數據也許不是程序員開發必備的技能,可是稍微瞭解瞭解也是好的,看成成一個輔助技能挺好的

2019轉折點的一年啊,加油

 開工大吉,哈哈哈接了公司好多紅包哦

相關文章
相關標籤/搜索