[國泰金控] 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/)
---