# 網路爬蟲與API介紹 (使用python程式語言)
## 網路爬蟲是什麼?
網路爬蟲也叫做網路機器人,可以代替人們自動地在網際網路中進行資料資訊的採集與整理。
[![](https://i.imgur.com/cwW2vpf.jpg)](https://www.youtube.com/watch?v=BdRjutf8K0c)
## API (Application Programming Interface)介紹
應用程式介面,縮寫為API,是一種計算介面
[![](https://i.imgur.com/Wd39U4I.jpg)](https://www.youtube.com/watch?v=zvKadd9Cflc)
### 政府資料開放平台
https://data.gov.tw/
[![](https://i.imgur.com/IgML1go.png)](https://data.gov.tw/)
https://data.gov.tw/dataset/105011
## Json 格式介紹
JSON(JavaScript Object Notation)是一種輕量級資料交換格式。其內容由**屬性**和**值**所組成,因此也有易於閱讀和處理的優勢。
JSON是獨立於程式語言的資料格式,目前有許多程式語言都能夠將其解析和字串化,其廣泛使用的程度也使其成為通用的資料格式。
```json
{
"firstName": "John",
"lastName": "Smith",
"sex": "male",
"age": 25,
"address":
{
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber":
[
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
```
[![](https://i.imgur.com/YUDx5dZ.png)](https://govdata.bot.com.tw/swagger-ui/index.html)
```json
{{
"success": true,
"result": {
"resource_id": "105011",
"records": [
{
"日期": "20211230",
"幣別": "USD",
"即期買入匯率": "27.63",
"即期賣出匯率": "27.73"
},
{
"日期": "20211229",
"幣別": "USD",
"即期買入匯率": "27.61",
"即期賣出匯率": "27.71"
},
{
"日期": "20211228",
"幣別": "USD",
"即期買入匯率": "27.635",
"即期賣出匯率": "27.735"
},
{
"日期": "20211227",
"幣別": "USD",
"即期買入匯率": "27.66",
"即期賣出匯率": "27.76"
},
{
"日期": "20211224",
"幣別": "USD",
"即期買入匯率": "27.685",
"即期賣出匯率": "27.785"
},
{
"日期": "20211223",
"幣別": "USD",
"即期買入匯率": "27.74",
"即期賣出匯率": "27.84"
},
{
"日期": "20211222",
"幣別": "USD",
"即期買入匯率": "27.76",
"即期賣出匯率": "27.86"
},
{
"日期": "20211221",
"幣別": "USD",
"即期買入匯率": "27.775",
"即期賣出匯率": "27.875"
},
{
"日期": "20211220",
"幣別": "USD",
"即期買入匯率": "27.785",
"即期賣出匯率": "27.885"
},
{
"日期": "20211217",
"幣別": "USD",
"即期買入匯率": "27.725",
"即期賣出匯率": "27.825"
}
]
}
}
```
## Google search API
[![](https://i.imgur.com/dFvUWdA.png)](https://serpapi.com/)
## 做中學--使用Python取得API資料
參考: https://hackmd.io/@alexhtwen/rkSdMPnZf?type=view#
1. 先安裝request
```python
pip install requests
```
2. 程式內容
```python=
"""
台灣銀行 政府資料開放平台 使用API服務
"""
import requests
import json # Python處理JSON文件的standard library。
import pandas as pd
# a) 透過requests模組索取API的JSON文件。
# 本例向International Space Station(ISS, 國際太空站)索取該站目前位置經緯度。
response = requests.get("https://govdata.bot.com.tw/105011/1/ByYearAndCcy?year=2021&ccy=USD")
resultText = response.text
# b) API資料抓回來後,直接顯示其內容。目前內容仍存在記憶體變數中,未存檔。
#print('b) API資料抓回來後,直接顯示其內容。目前內容仍存在記憶體變數中,未存檔。')
#print('result:')
#print(resultText)
# c) 藉json模組的method將JSON字串decode為Python內設資料型態(dict/list等)。
resultJsonDoc = json.loads(resultText)
print('------------')
print('c) 藉json模組的method將JSON字串decode為Python內設資料型態(dict/list等)。')
print('result:')
print(resultJsonDoc)
print('type(resultJsonDoc): ' + str(type(resultJsonDoc)))
print(resultJsonDoc['result']["records"])
d=resultJsonDoc['result']['records']
day_list = []
cash_buy_list=[]
cash_sell_list= []
currency_list = []
for fx in d:
day_list.append(fx['日期'])
currency_list.append(fx['幣別'])
cash_sell_list.append(fx['即期賣出匯率'])
cash_buy_list.append(fx['即期買入匯率'])
df = pd.DataFrame()
df["日期"]=day_list
df["幣別"] = currency_list
df["即期賣出匯率"] = cash_sell_list
df["即期買入匯率"] = cash_buy_list
df.set_index('日期')
df
```
## 做中學--使用Python爬取網路上的資料
參考: https://ithelp.ithome.com.tw/articles/10202121
以抓取台灣銀行牌告匯率為例
![](https://i.imgur.com/U2J5mkL.png)
---
![](https://i.imgur.com/AT7Yy3L.png)
---
r1=html_soup.find('table',attrs={'title':'牌告匯率'})
![](https://i.imgur.com/6L2B9PA.png)
---
![](https://i.imgur.com/lmRx8nS.png)
currency = rate_table[0].find('div', attrs={'class':'visible-phone print_hide'})
---
![](https://i.imgur.com/JIXKB3z.png)
```python=
"""
台灣銀行牌告匯率 爬蟲程式
"""
import requests
from bs4 import BeautifulSoup
import pandas as pd
r = requests.get("https://rate.bot.com.tw/xrt?Lang=zh-TW") #將此頁面的HTML GET下來
html_soup = BeautifulSoup(r.text, "lxml")
rate_table = html_soup.find('table', attrs={'title':'牌告匯率'}).find('tbody').find_all('tr')
# 查詢美元(也就是匯率表的第1個元素)對台幣的匯率
currency = rate_table[0].find('div', attrs={'class':'visible-phone print_hide'})
print(currency.text)
print(currency.text.replace(" ", "")) # 去掉所有的空白
buyin_rate = rate_table[0].find('td', attrs={'data-table':'本行現金買入'})
sellout_rate = rate_table[0].find('td', attrs={'data-table':'本行現金賣出'})
print("即時現金買入: {}, 即時現金賣出: {}".format(buyin_rate.text, sellout_rate.text))
print("即時現金買入: "+ buyin_rate.text+", 即時現金賣出:"+sellout_rate.text)
#把資料依照貨幣、即時現金買入、即時現金賣出存入陣列中
cash_buy_list = []
cash_sell_list= []
currency_list = []
allrate_table = html_soup.find('table', attrs={'title':'牌告匯率'}).find('tbody').find_all('tr')
for rate in allrate_table:
#print(rate)
prices = rate.find_all("td")
#print(prices[1].text)
cash_buy_list.append(prices[1].text) #把現金買入匯率存入cash_buy_list中
#print(prices[2].text)
cash_sell_list.append(prices[2].text) #把現金賣出匯率存入cash_sell_list中
currency_name = rate.find_all(class_="visible-phone print_hide")
#print(currency_name[1].text.strip())
currency_list.append(currency_name[1].text.strip()) #把貨幣資料存入currency_list中
cash_buy_list
df = pd.DataFrame()
df["貨幣"] = currency_list
df["現金買入"] = cash_buy_list
df["現金買出"] = cash_sell_list
df
```