[國泰金控] Python 與高效的工作術 第四課

Eugene Chang (張佑成)

October 2nd 2018

# 課程社團 ### FB 社團:https://www.facebook.com/groups/cathayewapy/ --- # 這邊再介紹另一個強大的網頁爬蟲套件 --- # pyquery [pyquery官網](https://pythonhosted.org/pyquery/) --- # Python 用來實作爬蟲的兩個主流套件: - BeautifulSoup [官方文件](https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/) - PyQuery [官方文件](https://pythonhosted.org/pyquery/) **BeautifulSoup** 是比較貼近**程式設計師**的角度去思考 **PyQuery** 貼近**網頁開發者**的角度去思考 --- # 範例網頁: [範例網頁](http://pythonscraping.com/pages/warandpeace.html) --- # 截取整個網頁 ```python # 使用 from 套件名稱 import 模組名稱 as 別名 from pyquery import PyQuery as pq url = "http://pythonscraping.com/pages/warandpeace.html" # 抓取頁面,存入html變數 html = pq(url) # 可以看到構成整個頁面的 html, css, 與 javascript 的程式碼 print(html) ``` --- # 網頁開發 101 任何網頁都是由**標籤(tag)**所組成,基本結構如下 ```html <標籤名稱 class="類別名稱">內容</標籤名稱> <標籤名稱 id="id名稱">內容</標籤名稱> ``` --- # 網頁開發 101 今天我們要擷取的任何內容,一定是被包裹在在某一個標籤裡面 而今天若網頁開發者需要改變任何一個標籤的**樣式**,就需要用到**css**語法 以上面的網頁為例,人名都是以綠色顯示,所以就先宣告一個名為 **green** 的 css 類別: ```html <style> .green{ color:#55ff55; } </style> ``` --- # 網頁開發 101 若今天希望讓一個標籤的궇容文字變成綠色,可以使用定義好的 .green 這個 css 類別: ```html <span class="green">Prince Vasili Kuragin</span> ``` *想了解更多 html 可以看一下 Mozilla 官網的教學:[HTML 基礎](https://developer.mozilla.org/zh-TW/docs/Learn/Getting_started_with_the_web/HTML_basics) --- ## 使用 標籤 「類別名稱」取得資料 要擷取資料前,首先需要透過方法**選擇**到該標籤 這時我們就需要介紹一下在網頁開發裡的強大套件:**jQuery** --- ## jQuery是什麼? 在網頁開發領域最被廣汎使用的套件之一。 網頁元素取得神器,使用css的選擇器選取元素,只要會css的選法,就能快速找到想要的元素 ```javascript $('選擇器') ``` PyQuery 使用類似 jQuery的方式取得資料 ```python html('選擇器') ``` --- ## 選擇器基礎語法 - 選取類別:使用 **英文句點+類別名稱** 例如: **.green** - 選取具有某類別的標籤 **標籤名稱+英文句點+類別名稱** 例如: **span.green** --- ## 選擇器基礎語法 ```python #selector = "span.green" selector = ".green" # 取得所有 class="green" 的 span 標籤 # 以 list 形式存入叫做 elements 的變數 elements = html(".green") elements ``` --- # 取得第一個符合條件的標簽 ```python elements[0].text # 'Anna\nPavlovna Scherer' ``` --- # 取出第一個標籤的文字 ```python # 取出第一個標籤的文字 text = elements[0] print(text) # Anna Pavlovna Scherer ``` --- ## 網頁爬蟲實戰:外幣匯率爬蟲 我們將截取臺灣銀行牌告匯率網頁的資料: ![](https://www.dropbox.com/s/j0m4n3vqkfmvdq4/exchange_rate_web.PNG?dl=1) --- # 連結 ## http://rate.bot.com.tw/xrt?Lang=zh-TW --- # 截取資料 ```python # 使用 from 套件名稱 import 模組名稱 as 別名 from pyquery import PyQuery as pq # 輸入抓取頁面目標網址 url = "http://rate.bot.com.tw/xrt?Lang=zh-TW" # 抓取台銀的匯率頁面,存入html物件 html = pq(url) # 可以看到構成整個頁面的 html, css, 與 javascript 的程式碼 print(html) ``` --- ## 範例網頁궇容 ![](https://www.dropbox.com/s/jl2he3lzjef2q7r/currency_rate.png?dl=1) --- ## 基礎語法 - 選取類別:使用 **英文句點+類別名稱** 例如: **.rate-content-cash** - 選取具有某類別的標籤 **標籤名稱+英文句點+類別名稱** 例如: **td.rate-content-cash** 我們要的匯率資料都是被放在 **.rate-content-cash** 以及 **.rate-content-sight** --- # 找出所有的匯率資料 ```python # 搜尋出所有 td,而且 css class 名稱有包含 'rate-content' 的標籤名稱 selector = "td[class^='rate-content-']" elements = html(selector) print(elements) ``` --- # 我們的匯率資料都被放在一個字串 ```python type(elements_text) ``` --- # 用 str.split() 把分解字串 ```python elements_text.split(' ') ``` --- # 接下來就可以這樣取得資料了... ```python usd_rate = price_ary[0] hkd_rate = price_ary[4] jpy_rate = price_ary[14] print(hkd_rate) # '3.738' ``` --- ## 利用巢狀 dict 封裝資料 ```python currency_list = ["USD", "HKD", "GBP", "AUD", "CAD", "SGD", "CHF", "JPY", "ZAR", "SEK", "NZD", "THB", "PHP", "IDR", "EUR", "KRW", "VND", "MYR", "CNY"] # 取得台銀的匯率頁面궇所有匯率的資料 selector = "td[class^='rate-content-']" elements = html(selector) # 分割轉好的文字,產生匯率的清單 elements_text = elements.text() rates_list = elements_text.split(' ') # 建立空的字典檔,當成資料集 data_set = {} # 對於每一個在 幣別清單中的 index for index in range(len(currency_list)): # 取得 幣別的名稱 currency_name = currency_list[index] # 根據幣別清單的index 計算 匯率清單的位置 並將相關數據存在變數中備用 cash_buy = rates_list[index * 4] cash_sell = rates_list[index * 4 + 1] sight_buy = rates_list[index * 4 + 2] sight_sell = rates_list[index * 4 + 3] # 在字典中,新增一個 key, 內容為 另一個字典 負責放四種匯率值 data_set[currency_name] = { 'CASH_BUY' : cash_buy, 'CASH_SELL' : cash_sell, 'SIGHT_BUY' : sight_buy, 'SIGHT_SELL': sight_sell } ``` --- # 取得港幣匯率資料 ```python print(data_set['HKD']) # {'CASH_BUY': '3.738', 'CASH_SELL': '3.954', 'SIGHT_BUY': '3.874', 'SIGHT_SELL': '3.934'} ``` --- # 取得港幣即期匯率資料 ```python print(data_set['HKD']['SIGHT_SELL']) # 3.934 ``` --- # 即時匯率看板 最後我們就可以將匯率爬蟲與 Excel 整合起來,用 Excel 打造一個及時看板 [範例 Excel 檔案](https://www.dropbox.com/s/hx7p1pwo54dlmoj/currency_trading.xlsm?dl=1) --- # 完整版程式碼 [連結](https://gist.github.com/yuyueugene84/d91da004b885a53275b46787c6f1c3e7) --- ## 現在我們離全自動還差最後一步 再厲害的程式,每天都要手動去跑一次程式,這很糟糕啊... --- ## 如何能夠讓電腦定時自動執行寫好的程式? 這時我們就需要學習如何**排程**了 --- ## 範例程式碼 [範例程式碼](https://gist.github.com/yuyueugene84/3a03f0ef2891e9f76a232e92ae0c4cc6) --- ## Windows 排程 **Windows Scheduler** ![alt text](https://www.dropbox.com/s/6h9vc5ywwegx048/scheduler.PNG?dl=1) --- ## 如何排程 我們必須知道如何在指令列上把 Python 的程式跑起來 --- ## 指令列簡介 簡單的邏輯是: ```bash command [-options] arg1 arg2 ... 指令名稱 選項 參數1 參數2 ``` 今天我們要用某一個應用程式跑一個檔案,指令就是: ```bash 你執行檔案用的程式 你要跑的那支程式的絕對路徑 ``` --- ## 如何排程 請搜尋一下 `python.exe` 檔的位置 在 cmd.exe 輸入: ``` where python ``` 應該會顯示: ```bash C:\Python\Python36\python.exe ``` ```bash # 若是使用 anaconda 的話... C:\Users\你的使用者名稱\Anaconda3\python.exe ``` --- ## 如何排程 接下來是找到你要執行的 Python 檔案的絕對路徑 (以我自己的電腦例): ```bash C:\Users\Eugene\Python\automate_boring_stuff_with_python\65_auto_whether_report.py ``` --- ## 最後我們要在指令列下的指令(以我自己的電腦例) ```bash C:\Users\Eugene\Anaconda3\python.exe C:\Users\Eugene\Python\automate_boring_stuff_with_python\66_auto_tsmc_stock_report.py ``` --- ## 接下來我們就可以到工作排程器建立一個新工作 --- ## 全自動的股價觀測機器人完工! □ 撒花ing □ --- ## Mac 排程 **crontab** [教學](http://honglu.me/2014/09/20/OSX%E7%B3%BB%E7%BB%9F%E6%B7%BB%E5%8A%A0%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1/) ---