# 網路爬蟲與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 ```