所以,本文就來接續[Python爬蟲教學]Python網頁爬蟲寫入資料到Google BigQuery雲端數據庫指南文章,把其中建置的Python網頁爬蟲部署到Google Cloud雲端平台,並且依然保有原來資料儲存到Google Bigquery數據庫的功能。其中的實作步驟包含:
- 建置Python網頁爬蟲
- 建立Google Cloud Function
- 測試Google Cloud Function
一、建立Python網頁爬蟲
from datetime import datetime from google.cloud import bigquery from google.oauth2 import service_account import requests import pandas as pd today = datetime.now().strftime('%Y%m%d') #西元年(yyyymmdd) chinese_today = f"{(datetime.now().year - 1911)}/{datetime.now().strftime('%m/%d')}" #民國年(yyy/mm/dd) stocks = ['2330', '2409', '2382'] #想要爬取的股票代碼 combined = [] # 合併結果 for stock_no in stocks: response = requests.get( f'https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date={today}&stockNo={stock_no}') response_data = response.json()['data'] result = [data for index, data in enumerate(response_data) if chinese_today in response_data[index]] if result: # 如果有資料 result[0].insert(0, stock_no) combined.append(result[0])
以及為了在Google Cloud雲端平台上能夠進行服務驗證,將原本使用os模組(Module)讀取憑證(Credentials)的方式,修改為透過Google的service_account模組(Module)來讀取,如下範例第3、28、30行:
from datetime import datetime from google.cloud import bigquery from google.oauth2 import service_account import requests import pandas as pd today = datetime.now().strftime('%Y%m%d') #西元年(yyyymmdd) chinese_today = f"{(datetime.now().year - 1911)}/{datetime.now().strftime('%m/%d')}" #民國年(yyy/mm/dd) stocks = ['2330', '2409', '2382'] #想要爬取的股票代碼 combined = [] # 合併結果 for stock_no in stocks: response = requests.get( f'https://www.twse.com.tw/exchangeReport/STOCK_DAY?response=json&date={today}&stockNo={stock_no}') response_data = response.json()['data'] result = [data for index, data in enumerate(response_data) if chinese_today in response_data[index]] if result: # 如果有資料 result[0].insert(0, stock_no) combined.append(result[0]) df = pd.DataFrame(combined, columns=['stock_no', 'traded_date', 'traded_shares', 'traded_price', 'opening_price', 'high_price', 'low_price', 'closing_price', 'gross_spread', 'trading_volume']) credentials = service_account.Credentials.from_service_account_file('stocks-bigquery-key.json') client = bigquery.Client(credentials=credentials) table_id = 'stocks-bigquery.stocks.daily_price' job = client.load_table_from_dataframe(df, table_id) job.result() table = client.get_table(table_id) print(f'已存入{table.num_rows}筆資料到{table_id}')
pip freeze > requirements.txt執行結果
二、建立Google Cloud Function(雲端函式)
簡單來說,就是不用建立伺服器(Compute),就能夠利用Google Cloud Function(雲端函式)來封裝我們的Python網頁爬蟲,再透過事件來驅動這個雲端函式即可執行,非常的方便。
而建立的方式需先前往Google Cloud Platform(雲端平台),並且在左側導覽選單中選擇「Cloud Functions(雲端函式)」,如下圖:
接著,就可以看到如下圖的畫面:
點擊「建立函式」後,自訂「函式名稱」及選擇「區域(asia-east1)」,如下圖:而觸發條件選擇「Cloud Pub/Sub」,為事件驅動應用程式的訊息傳遞與擷取作業,也就是其它服務能夠透過Cloud Pub/Sub主題來驅動這個Google Cloud Function(雲端函式),如下圖:點擊「建立主題」,自訂「主題ID」,如下圖:建立成功後,如下圖:點擊儲存,如下圖:而下方的「執行階段、建構作業、連線和安全性設定」保留預設值,點擊「下一步」即可,如下圖:接下來,就要封裝我們的Python網頁爬蟲程式碼,在「執行階段」的地方選擇所使用的Python版本,以及啟用「Cloud Build API」,如下圖:其中,main.py檔案就是主程式,就可以將Python網頁爬蟲的程式碼貼到裡面,如下圖:
切換到requirements.txt,同樣將剛剛所產生的requirements.txt的內容貼入,如下圖:
以及利用右上角的「+」新增Python網頁爬蟲寫入Google Bigquery時所需要的憑證檔(stocks-bigquery-key.json),並且,將憑證檔中的內容貼入,如下圖:
接著,按下「部署」後,即可看到如下圖的結果:
三、測試Google Cloud Function(雲端函式)
四、小結
當然,我們會想要Google Cloud Functions(雲端函式)每天自動化執行,所以在下一篇文章將會來分享如何建立排程器,定時執行Google Cloud Functions(雲端函式),記得持續鎖定唷~
如果您喜歡我的文章,別忘了在下面訂閱本網站,以及幫我按五下Like(使用Google或Facebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。
Mike大大好,很感謝您一直分享很多有關python跟爬蟲的文
回覆刪除你寫得太快,我都來不及練了><
這篇文裡面,有2個地方想跟您討論一下
1. 最後的段落中,有提到pip freeze > requirement.txt
你的圖片裡面,requirement是30幾行,我的快要300行,而且很多的package是path而不是提到版號,一剛開始的時候我在佈署這個步驟是失敗的
後來改用pipreqs產生requirement就通過了佈署,可是requirement只剩下4行
你放上GCP的requirement有經過整理嗎?
2. 我測試的時候是9/21,還在連假中,經過測試GCP回饋是500 Internal Server Error。在local端執行是OK的,我在猜是不是因為今天股市沒開,DF是空的,所以在run到job跟job.result()的時候出錯了
想要就這樣的猜測跟您討論看看
我自回~
刪除後來去修改了requirement.txt就一切安好了
其實中間有嘗試過用pip reqs --encoding=uft8來產生requirement
可是這會只侷限於有import的lib,相依的就不會在requirement裡面了
你作每個project都會新建一個venv嗎?