cheerio


如果你有用過 jQuery ,你大概對 CSS Selector 不陌生,要透過 CSS Selector 取得對應的標籤,你只需要:

$("li.item h2")

那麼問題來了,在本機電腦上並沒有 jQuery 可以用,也沒有瀏覽器幫你建好 DOM Tree。該怎麼辦呢?剛好這邊有個 Server 端的 jQuery 實作叫 Cheerio ,那就來用用看吧!

擴充 cheerio 套件

npm install cheerio --save

Cheerio 的使用方式也是相當簡單,把整個 HTML 扔給他,他就會送你一個「$」,就可以拿來跑 CSS Selector 了(取得部落格中的標題):

$ = cheerio.load(blogHTMLString);
titles = $("li.item h2");

接下來你大概也知道怎麼辦了,利用 jQuery 的 text 函式取得標籤的內容:

var result = [];
for(i=0;i<titles.length;i++) { 
    result.push($(titles[i]).text()); 
}

參考資料:資料爬蟲實戰-使用 node.js


來製作第一個爬蟲程式 - 取得台北溫濕度

先來複習如何建立專案,建立資料夾並且安裝好套件,操作如下

mkdir webscraper
cd webscraper
npm install request cheerio

接著建立一個js檔案,名為scraper.js,裡面要寫上爬蟲程式


讓我們開始正題吧!先打開Weather Underground - 台北市天氣資料的網站,觀察一下台北市的「溫度」與「濕度」在網頁上的哪個位置,接著按下F12打開Dev tool去選取溫度的區塊,會看到以下的html程式碼

<span class="wx-data" data-station="INEWTAIP14" data-variable="temperature">
    <span class="wx-value">28.1</span>
    <span class="wx-unit">°C</span>
</span>

如果用jQuery去取得溫度28.1的話,寫法如下

$("[data-variable='temperature'] .wx-value").html()

你已經知道如何取得溫度了,那想想看,濕度該怎麼取得呢?


接著就在scraper.js裡面寫上下方的程式碼

var request = require("request");
var cheerio = require("cheerio");

// 台北市的氣溫
var url = "http://www.wunderground.com/weather-forecast/zmw:00000.1.58968";

// 取得網頁資料
request(url, function (error, response, body) {
  if (!error) {

    // 用 cheerio 解析 html 資料
    var $ = cheerio.load(body);

    // 篩選有興趣的資料
    var temperature = $("[data-variable='temperature'] .wx-value").html();
    var humidity = $("[data-variable='humidity'] .wx-value").html();

    // 輸出
    console.log("氣溫:攝氏 " + temperature + " 度");
    console.log("濕度:" + humidity + "%");

  } else {
    console.log("擷取錯誤:" + error);
  }
});

參考資料:Node.js 自動抓取網頁資料範例程式教學


練習1 - 抓取youtube首頁中「發燒影片」的標題列表

抓取youtube台灣漫威的影片列表中所有影片的標題,如下

[ 
  '【黑豹】官方中文前導預告 2018年 2月13日 見證傳說',
  '【星際異攻隊2】特別收錄: 星爵覺得超讚的電影片段',
  '【星際異攻隊2】克里斯玩道具!',
  '【星際異攻隊2】 小格魯特萌力全開 現正熱映!',
  '【星際異攻隊2】電影片段: 這個扭不要按啦!  (好評熱映中)',
  '【星際異攻隊2】電影片段: 說謊大師 德克斯 (電影現正熱映中)',
  '【星際異攻隊2】導演訪談'
]

練習2 - 抓取動物星球節目列表

抓取動物星球頻道的節目列表,並將節目資訊分成以json格式儲存,如下列的呈現方式。

[ 
  { 
    title: '德州保育戰第2季',
    description: '4/21起,每週五晚間10點。德州什麼都大,而德州狩獵警官必須保護德州幅員廣大的天然資源,確保2700萬當地人民守法不破壞大自然。',
    img: 'http://www.discoverychannel.com.tw/wp-content/uploads/2017/03/35264_ep207_0011_image16x9.jpg' 
  },
  { 
    title: '百變水族箱第6季',
    description: '5/19起,每週五晚間9點。《百變水族箱》又回來啦!節目帶著觀眾悠游ATM水族箱公司:美國首屈一指的水族箱製造商。',
    img: 'http://www.discoverychannel.com.tw/wp-content/uploads/2017/04/34686_ep601_0131_image16x9.jpg' 
  },
  {
    title: '河馬老大',
    description: '5/6,週六晚間7點。《河馬老大》捕捉河馬真實生活,追隨一隻河馬媽媽冒著危險保護河馬寶寶的安全,在危機四伏的盧安瓜河中長大。',
    img: 'http://www.discoverychannel.com.tw/wp-content/uploads/2017/04/22755_12-11_image16x9.jpg' 
  }
]

infoLite

results matching ""

    No results matching ""