02epaper.gotop.com.tw/pdfsample/acl053700.pdf2-17 大數據資料爬取與分析 02 2.4 selenium...

12
Python 大數據特訓班 大數據的時代來臨,存在於網路中的巨量資料就成 為收集時的重要來源。Python 程式能透過低成本、 自動化的方式由網路中爬取大量而有效的資料,對 於資料科學家來說是相當重要的技巧。 在本章中將介紹 Python 在網路上進行資料擷取時不 能錯過的重要技巧與模組: Requests :網路爬蟲的基礎,能依需求要求伺服 器回傳資料。 BeautifulSoup:網頁資料分析與擷取的強大模 組。 Regular Expression:正規表示式能針對資料中 特殊的格式或結構進行字串的處理。 Selenium:可利用指令的組合在網頁上進行自動 化操作,達到測試的功能。 Pandas:可快速由網路的載入資料並進行儲存的 相關處理。 大數據資料爬取與分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 02 Chapter

Upload: others

Post on 28-Aug-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 02epaper.gotop.com.tw/PDFSample/ACL053700.pdf2-17 大數據資料爬取與分析 02 2.4 Selenium 模組:瀏覽器自動化操作一般情況下,我們都是以人工執行瀏覽器上的各項操作。事實上,只要安裝自動

Python 大數據特訓班

大數據的時代來臨,存在於網路中的巨量資料就成

為收集時的重要來源。Python程式能透過低成本、自動化的方式由網路中爬取大量而有效的資料,對

於資料科學家來說是相當重要的技巧。

在本章中將介紹 Python在網路上進行資料擷取時不能錯過的重要技巧與模組:

• Requests :網路爬蟲的基礎,能依需求要求伺服器回傳資料。

• BeautifulSoup:網頁資料分析與擷取的強大模組。

• Regular Expression:正規表示式能針對資料中特殊的格式或結構進行字串的處理。

• Selenium:可利用指令的組合在網頁上進行自動化操作,達到測試的功能。

• Pandas:可快速由網路的載入資料並進行儲存的相關處理。

大數據資料爬取與分析

. . . . . . . . . . . . . . . . . . . . .....................................

............. .. .. .. .. .. . .

. . . .. . . . . . . . . . . . . . . . . . . . . . . . ............................

...

............. .. .. . .. . .

. . . .. . . . . . ......................................

....................

.......

02Chapter

Page 2: 02epaper.gotop.com.tw/PDFSample/ACL053700.pdf2-17 大數據資料爬取與分析 02 2.4 Selenium 模組:瀏覽器自動化操作一般情況下,我們都是以人工執行瀏覽器上的各項操作。事實上,只要安裝自動

2-17

大數據資料爬取與分析 02

2.4 Selenium模組:瀏覽器自動化操作

一般情況下,我們都是以人工執行瀏覽器上的各項操作。事實上,只要安裝自動

化操作模組,Python 就可以自動執行。

2.4.1 使用 Selenium

在網頁應用程式開發時,測試使用者介面一向是相當困難的工作。如果以手動的

方式進行操作,不僅會因為人力時間而受到限制,而且也容易出錯。Selenium 的

出現就是為了解決這個問題,它可以藉由指令自動操作網頁,達到測試的功能。

安裝 Selenium

首先必須安裝 Selenium 模組:

pip install selenium

下載 Chrome WebDriver

在 Google Chrome 瀏覽器操作,還必須安裝相關的驅動程式,請依照作業系統

版本 (Linux, Mac, Windows) 下載 Chrome WebDriver 並解壓縮,網址如下:

https://sites.google.com/a/chromium.org/chromedriver/downloads

以 Windows 作業系統為例,下載 <chromedriver_win32.zip> 後解壓縮產生

<ChromeDrvier.exe> 檔,將 <ChromeDrvier.exe> 複製到 <C:\ProgramData\

Anaconda3>目錄或開發專案的目錄中。

建立 Google Chrome 瀏覽器物件

匯入 selenium 模組後,即可以使用 webdriver.Chrome() 建立 Google Chrome

瀏覽器物件。

from selenium import webdriver

driver = webdriver.Chrome()

Selenium Webdriver 的屬性和方法

Selenium Webdriver API 常用的屬性和方法如下:

Page 3: 02epaper.gotop.com.tw/PDFSample/ACL053700.pdf2-17 大數據資料爬取與分析 02 2.4 Selenium 模組:瀏覽器自動化操作一般情況下,我們都是以人工執行瀏覽器上的各項操作。事實上,只要安裝自動

2-18

Python 大數據特訓班

方法 說明

current_url 取得目前的網址。

page_source 讀取網頁的原始碼。

text 讀取元素內容。

size 傳回元素大小,例如:{'width': 250, 'height': 30}。

get_window_position() 取得視窗左上角的位置。

set_window_position(x,y) 設定視窗左上角的位置。

maximize_window() 瀏覽器視窗最大化。

get_window_size() 取得視窗的高度和寬度。

set_window_size(x,y) 設定視窗的高度和寬度。

click() 按單擊鈕。

close() 關閉瀏覽器。

get(url) 連結 url 網址。

refresh() 重新整理畫面。

back() 返回上一頁。

forward() 下一頁。

clear() 清除輸入內容。

send_keys() 以鍵盤輸入。

submit() 提交。

quit() 關閉瀏覽器並且退出驅動程序。

利用 Python操作 Google Chrome 瀏覽器

建立 Google Chrome 瀏覽器物件後,即可以 get() 方法連結到指定的網址,最後

以 quit() 方法關閉瀏覽器。 例如:連結 Google 網站。

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('http://www.google.com')

driver.quit()

Page 4: 02epaper.gotop.com.tw/PDFSample/ACL053700.pdf2-17 大數據資料爬取與分析 02 2.4 Selenium 模組:瀏覽器自動化操作一般情況下,我們都是以人工執行瀏覽器上的各項操作。事實上,只要安裝自動

2-19

大數據資料爬取與分析 02

2.4.2 尋找網頁元素

如果我們想要和網頁互動,例如:按下按鈕、超連結、輸入文字等,就必須先取

得網頁元素,才能對這些特定的網頁元素進行操作。

Selenium Webdriver API 提供多種取得網頁元素的方法。如下:

屬性或方法 說明

find_element_by_id(id) 以 id 查詢符合的元素。

find_element_by_class_name(name) 以類別名稱查詢符合的元素。

find_element_by_tag_name("tag name") 以 HTML 標籤查詢符合的元素。

find_element_by_name(name) 以名稱查詢符合的元素。

find_element_by_link_text(text) 以連結文字查詢符合的元素。

find_element_by_partial_link_text("cheese") 以部份連結文字查詢符合的元素。

find_element_by_css_selector(selector) 以 CSS 選擇器查詢符合的元素。

find_element_by_xpath()以 xml 的路徑查詢, xpath 就是利用 node 的階層關係,以及每個 node 的特性來找詢元素。

在上面各個方法的 element 後面加上 s ,會傳回符合查詢的元素串列。

以實例說明如下,下列的 HTML 為原始碼,webdriver.Chrome() 物件為 driver 。

<html>

<body>

<h1>Welcome</h1>

<form id="loginForm">

<p class="content">Are you sure you want to do this?</p>

<a href="continue.html">Continue</a>

<a href="cancel.html">Cancel</a>

<input name="username" type="text" />

<input name="password" type="password" />

<input name="continue" type="submit" value="Login" />

<input name="continue" type="button" value="Clear" />

</form>

</body>

<html>

Page 5: 02epaper.gotop.com.tw/PDFSample/ACL053700.pdf2-17 大數據資料爬取與分析 02 2.4 Selenium 模組:瀏覽器自動化操作一般情況下,我們都是以人工執行瀏覽器上的各項操作。事實上,只要安裝自動

3-8

Python 大數據特訓班

3.1.4 柱狀圖及圓餅圖

柱狀圖繪製

Matplotlib 除了可畫線形圖外,還可讓資料以柱狀圖或圓餅圖呈現。

柱狀圖 是以 bar 方法繪製,語法為:

模組名稱 .bar(x座標串列 , y座標串列,其他參數⋯)

繪製柱狀圖的參數與繪製線形圖類似,除了一些設定線的特性參數如線寬度、線

樣式等不能使用外,其餘參數在繪製柱狀圖皆可使用。

下面範例與前一範例相同,只是以柱狀圖呈現,並以中文顯示各項文字。

範例:繪製柱狀圖

程式碼僅列出與前一範例不同之處。

程式碼:ch03\bar1.py⋯⋯⋯

5 plt.bar(listx1, listy1, label="男性 ")

⋯⋯⋯

8 plt.bar(listx2, listy2, color="red", label="女性 ")

⋯⋯⋯

12 plt.title("零用金統計 ")

13 plt.xlabel("年齡 ")

14 plt.ylabel("零用金數目 ")

⋯⋯⋯

Page 6: 02epaper.gotop.com.tw/PDFSample/ACL053700.pdf2-17 大數據資料爬取與分析 02 2.4 Selenium 模組:瀏覽器自動化操作一般情況下,我們都是以人工執行瀏覽器上的各項操作。事實上,只要安裝自動

3-9

數據資料視覺化 03

圓餅圖繪製

圓餅圖 是以 pie 方法繪製,語法為:

模組名稱 .pie(資料串列 [, 選擇性參數串列 ])

「資料串列」是一個數值串列,為畫圓餅圖的資料,其為必要參數。

「選擇性參數串列」可有可無,參數名稱及功能為:

█ labels:每一個項目標題組成的串列。 █ colors:每一個項目顏色組成的串列。 █ explode:每一個項目凸出數值組成的串列,「0」表示正常顯示未爆出。下圖顯示第一部分不同凸出值的效果。

explode=0.1 explode=0.2

█ labeldistance:項目標題與圓心的距離是半徑的多少倍,例如「1.1」表示項目標題與圓心的距離是半徑的 1.1 倍。

█ autopct:項目百分比的格式,語法為「%格式 %%」,例如「%2.1f%%」表示整數 2 位數,小數 1 位數。

█ shadow:布林值,True 表示圖形有陰影,False 表示圖形沒有陰影。

█ startangle:開始繪圖的起始角度,繪圖會以逆時針旋轉計算角度。

0 度180 度

270 度

90 度

Page 7: 02epaper.gotop.com.tw/PDFSample/ACL053700.pdf2-17 大數據資料爬取與分析 02 2.4 Selenium 模組:瀏覽器自動化操作一般情況下,我們都是以人工執行瀏覽器上的各項操作。事實上,只要安裝自動

4-9

數據資料儲存與讀取 04

4.2 csv 資料的儲存與讀取

只要匯入 csv 模組,就可以存取 .csv 檔案。

4.2.1 csv 檔案儲存

可以使用串列或字典資料類型,將資料寫入 csv 檔案。

寫入 csv 檔案

利用 csv 的 writer 方法,可以建立一個寫入 csv 檔案的物件,再利用 writerow

就可以寫入一個串列資料。例如:寫入 <test.csv>檔。

程式碼:ch04\csv_write.pyimport csv

# 開啟輸出的 csv 檔案

with open('test.csv', 'w', newline='') as csvfile:

# 建立 csv 檔寫入物件

writer = csv.writer(csvfile)

# 寫入欄位名稱

writer.writerow(['姓名 ', '身高 ', '體重 '])

# 寫入資料

writer.writerow(['chiou', 170, 65])

writer.writerow(['David', 183, 78])

開啟 csv 檔案時加上參數 newline='',可以讓資料中的換行字元正確被解析。儲

存的 <test.csv> 檔案 ,它是以逗號「,」為分隔字元儲存,其內容如下:

Page 8: 02epaper.gotop.com.tw/PDFSample/ACL053700.pdf2-17 大數據資料爬取與分析 02 2.4 Selenium 模組:瀏覽器自動化操作一般情況下,我們都是以人工執行瀏覽器上的各項操作。事實上,只要安裝自動

4-10

Python 大數據特訓班

dictionary 寫入 csv 檔案

也可以使用 csv.DictWriter 直接將 dictionary 寫入 csv 檔案中。

程式碼:ch04\csv_write_dict.pyimport csv

with open('test.csv', 'w', newline='') as csvfile:

# 定義欄位

fieldnames = ['姓名 ', '身高 ', '體重 ']

# 將 dictionary 寫入 csv 檔

writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

# 寫入欄位名稱

writer.writeheader()

# 寫入資料

writer.writerow({'姓名 ': 'chiou', '身高 ': 17, '體重 ': 6})

writer.writerow({'姓名 ': 'David', '身高 ': 183, '體重 ': 78})

4.2.2 csv 檔案讀取

也可以將 csv 檔案中資料,使用串列或字典方式讀取。

讀取 csv 檔案

利用 csv 的 reader 方法,可以讀取 csv 檔案內容,例如:讀取 <test.csv> 檔。

程式碼:ch04\csv_read.pyimport csv

# 開啟 csv 檔案

with open('test.csv', newline='') as csvfile:

# 讀取 csv 檔案內容

rows = csv.reader(csvfile)

# 以迴圈顯示每一列

for row in rows:

print(row)

Page 9: 02epaper.gotop.com.tw/PDFSample/ACL053700.pdf2-17 大數據資料爬取與分析 02 2.4 Selenium 模組:瀏覽器自動化操作一般情況下,我們都是以人工執行瀏覽器上的各項操作。事實上,只要安裝自動

Python 大數據特訓班

天氣對於人類的生活影響極大,所以氣象資訊就成

為許多人每天都要關切的重要訊息。目前氣象局在

網站上雖然提供了相當詳細的資訊,但呈現的方式

很固定,也可能不符合每個人的期待。

本專題的第一個重點是如何擷取氣象局鄉鎮地區的

氣象資訊,並在整理後儲存於自行架設的 MySQL資料庫中,如此一來使用者就能利用到自己的系統上。

另外,為了使儲存資料能再讓其他平台使用,第二

個重點即是利用免費伺服器資源將資料以 API的方式以 JSON的格式發佈在網路上,讓其他人可以串接進行利用。

實戰:鄉鎮市區 天氣預報及建立 API

. . . . . . . . . . . . . . . . . . . . .....................................

............. .. .. .. .. .. . .

. . . .. . . . . . . . . . . . . . . . . . . . . . . . ............................

...

............. .. .. . .. . .

. . . .. . . . . . ......................................

....................

.......

11Chapter

Page 10: 02epaper.gotop.com.tw/PDFSample/ACL053700.pdf2-17 大數據資料爬取與分析 02 2.4 Selenium 模組:瀏覽器自動化操作一般情況下,我們都是以人工執行瀏覽器上的各項操作。事實上,只要安裝自動

11-2

Python 大數據特訓班

11.1 專題方向目前國家的氣象預報資料,最小區域單位為縣市,因為範圍較大與居住地的氣象

常有不小誤差。其實氣象局提供了台灣 368 個鄉鎮市區的氣象資料,可以讓使用

者更精準掌握居住地的天氣。本專題將擷取鄉鎮市區氣象資料儲存於 MySQL資

料庫中,並使用 Django 建立 API 傳回鄉鎮市區氣象 JSON 資料的網站,再上傳

到 Heroku 讓所有人都可以使用此 API。

專題檢視

在氣象局的網站中會即時呈現每個鄉鎮市區 48小時的預報資料,每 3 小時更新

一次。本專題 <threeday1.py> 執行後會擷取天氣資料儲存於 MySQL資料庫。儲

存資料時會先檢查資料庫中是否已存在該筆資料,若已存在就跳過該筆資料。

本專題先使用 Django 模組建立網站,完成傳回鄉鎮市區 2 天氣象預報的 JSON

資料 API,再將網站上傳到 Heroku 免費伺服器,讓所有人都可以使用此 API 開

發各種應用程式。

Page 11: 02epaper.gotop.com.tw/PDFSample/ACL053700.pdf2-17 大數據資料爬取與分析 02 2.4 Selenium 模組:瀏覽器自動化操作一般情況下,我們都是以人工執行瀏覽器上的各項操作。事實上,只要安裝自動

11-4

Python 大數據特訓班

11.2 關鍵技術查詢氣象局鄉鎮市區氣象資料需使用鄉鎮市區代碼,但主計總處僅提供村里代

碼,我們將從村里代碼中擷取鄉鎮市區代碼,方便查詢。

氣象局網頁顯示的鄉鎮市區氣象資料是一個結構相當複雜的表格,以下將詳細解

析表格結構取出所有的氣象資料。

11.2.1 擷取 Excel 檔資料查詢氣象局鄉鎮市區氣象資料的網址為:

http://www.cwb.gov.tw/V7/forecast/town368/3Hr/鄉鎮市區代碼 .htm

如何取得鄉鎮市區代碼呢?行政院主計總處有村里代碼資料,並提供 Excel 檔

下 載, 網 址 為「https://www.stat.gov.tw/ct.asp?xItem=14380&CtNode=1519&

mp=4」:

開啟下載的 <712693030RPKUP4RX.xlsx> 檔,發現其中有 7851 筆資料,查詢

鄉鎮市區代碼資料非常困難,需要將其精簡。

Page 12: 02epaper.gotop.com.tw/PDFSample/ACL053700.pdf2-17 大數據資料爬取與分析 02 2.4 Selenium 模組:瀏覽器自動化操作一般情況下,我們都是以人工執行瀏覽器上的各項操作。事實上,只要安裝自動

11-10

Python 大數據特訓班

11.3 實戰:擷取天氣資料及建立 API

在分析取得鄉鎮市區氣象資料後,就可將資料儲存於 MySQL 資料庫中,往後可

隨時查詢與應用這些資料。由於目前中央氣象局並未提供鄉鎮市區氣象資料 API

接口,所以本專題更進一步以 Django 建立傳回鄉鎮市區氣象 JSON 資料的網

站,再上傳到 Heroku 免費伺服器,讓所有人都可以使用此 API 進一步開發各種

應用程式。

11.3.1 建立鄉鎮市區代碼 CSV 檔首 先 開 啟 行 政 院 主 計 總 處「https://www.stat.gov.tw/ct.asp?xItem=14380&

CtNode=1519&mp=4」網頁,按 (Excel 檔 ) 連結下載 Excel 檔。將下載的

<712693030RPKUP4RX.xlsx> 檔複製到本章 Python 程式資料夾中。

由 <712693030RPKUP4RX.xlsx> 檔擷取鄉鎮市區代碼並建立 CSV 檔的程式:

程式碼:ch11\district1.py 1 import pandas

2

3 df = pandas.read_excel('712693030RPKUP4RX.xlsx')

4 header = df.iloc[2] #取得標題

5 df1 = df[3:].copy() #去除前三列

6 df1 = df1.rename(columns = header) #重置標題

7 df2 = df1.drop(columns=['縣市代碼 ', '村里代碼 ', '村里名稱 ',

'村里代碼 '], axis=1) #去除四行資料

8 df3 = df2.drop_duplicates() #移除重複資料

9

10 df3.to_csv('district.csv', encoding='big5', index=False)

程式說明

█ 3 以 Pandas 讀入 Excel 檔。

█ 4 先將標題列存於 header 變數中。

█ 5 資料是從第 4 列開始,所以移除前 3 列資料。

█ 6 將標題列重新加入 DataFrame 中。

█ 7 移除不需要的欄位資料,只留下 縣市名稱、區里代碼 及 區鄉鎮名稱 3 個欄位資料。

█ 8 移除重複資料。

█ 10 存為 CSV 檔。為方便開啟檔案查詢,此處編碼使用「big5」。