# Node.js 與網路爬蟲
###### tags: `健行科大`, `JavaScript 物聯網實作`
## Node.js 第一支程式 - Hello world 網站
```javascript=
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
```
## 解析匯率網頁
* 台灣銀行的牌告匯率 (http://rate.bot.com.tw/xrt?Lang=zh-TW)
![](https://i.imgur.com/lN0BnPl.jpg)
* 按右鍵打開網頁原始碼,看一下匯率在哪裡
* 抓取日幣現金匯率,就要看到日幣的這個欄位
![](https://i.imgur.com/H6EhiBG.jpg)
* 把這段 class 複製下來,解析網頁時需要抓取的名稱
```
rate-content-cash text-right print_hide
```
![](https://i.imgur.com/RsInO28.jpg)
## 安裝套件
```javascript=
// request:抓取整個網頁的程式碼
npm install request
// cheerio:後端的 jQuery
npm install cheerio
```
## 建立 queryjp.js 檔案,取得台銀牌告網頁資料
```javascript=
var request = require("request");
var cheerio = require("cheerio");
var jp = function() {
request({
url: "http://rate.bot.com.tw/Pages/Static/UIP003.zh-TW.htm",
method: "GET"
}, function(error, response, body) {
if (error || !body) {
return;
} else {
// 爬完網頁後要做的事情
console.log(body);
}
});
};
jp();
```
### 取得台銀牌告匯率資料
```javascript=
var request = require("request");
var cheerio = require("cheerio");
var jp = function() {
request({
url: "http://rate.bot.com.tw/Pages/Static/UIP003.zh-TW.htm",
method: "GET"
}, function(error, response, body) {
if (error || !body) {
return;
} else {
// 爬完網頁後要做的事情
var $ = cheerio.load(body);
var target = $(".rate-content-sight.text-right.print_hide");
console.log(target);
}
});
};
jp();
```
:::info
* target 印出的是一個很嚇人的陣列
* .rate-content-sight.text-right.print_hide 的數量多達 38 個
* 從陣列中看不出日幣在哪裡 (因都隱藏在 children 裡)
![](https://i.imgur.com/LcHTkH4.jpg)
:::
:::info
日幣的位置排在第 16 位,也就是陣列的 15
![](https://i.imgur.com/6Q1RFJt.jpg)
:::
### 取得日幣匯率資料
```javascript=
var request = require("request");
var cheerio = require("cheerio");
var jp = function() {
request({
url: "http://rate.bot.com.tw/Pages/Static/UIP003.zh-TW.htm",
method: "GET"
}, function(error, response, body) {
if (error || !body) {
return;
} else {
// 爬完網頁後要做的事情
var $ = cheerio.load(body);
var target = $(".rate-content-sight.text-right.print_hide");
console.log(target[15].children);
}
});
};
jp();
```
![](https://i.imgur.com/nc6BgSz.png)
### 精準取得日幣匯率數值
```javascript=
var request = require("request");
var cheerio = require("cheerio");
var jp = function() {
request({
url: "http://rate.bot.com.tw/Pages/Static/UIP003.zh-TW.htm",
method: "GET"
}, function(error, response, body) {
if (error || !body) {
return;
} else {
// 爬完網頁後要做的事情
var $ = cheerio.load(body);
var target = $(".rate-content-sight.text-right.print_hide");
console.log(target[15].children[0].data);
}
});
};
jp();
```
### 定時取日幣匯率數值
```javascript=
var request = require("request");
var cheerio = require("cheerio");
var jp = function() {
request({
url: "http://rate.bot.com.tw/Pages/Static/UIP003.zh-TW.htm",
method: "GET"
}, function(error, response, body) {
if (error || !body) {
return;
} else {
// 爬完網頁後要做的事情
var $ = cheerio.load(body);
var target = $(".rate-content-sight.text-right.print_hide");
console.log(target[15].children[0].data);
}
});
};
jp();
setInterval(jp, 10000);
```