02epaper.gotop.com.tw/pdfsample/acl053700.pdf2-17 大數據資料爬取與分析 02 2.4 selenium...
TRANSCRIPT
Python 大數據特訓班
大數據的時代來臨,存在於網路中的巨量資料就成
為收集時的重要來源。Python程式能透過低成本、自動化的方式由網路中爬取大量而有效的資料,對
於資料科學家來說是相當重要的技巧。
在本章中將介紹 Python在網路上進行資料擷取時不能錯過的重要技巧與模組:
• Requests :網路爬蟲的基礎,能依需求要求伺服器回傳資料。
• BeautifulSoup:網頁資料分析與擷取的強大模組。
• Regular Expression:正規表示式能針對資料中特殊的格式或結構進行字串的處理。
• Selenium:可利用指令的組合在網頁上進行自動化操作,達到測試的功能。
• Pandas:可快速由網路的載入資料並進行儲存的相關處理。
大數據資料爬取與分析
. . . . . . . . . . . . . . . . . . . . .....................................
............. .. .. .. .. .. . .
. . . .. . . . . . . . . . . . . . . . . . . . . . . . ............................
...
............. .. .. . .. . .
. . . .. . . . . . ......................................
....................
.......
02Chapter
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 常用的屬性和方法如下:
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()
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>
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("零用金數目 ")
⋯⋯⋯
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 度
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> 檔案 ,它是以逗號「,」為分隔字元儲存,其內容如下:
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)
Python 大數據特訓班
天氣對於人類的生活影響極大,所以氣象資訊就成
為許多人每天都要關切的重要訊息。目前氣象局在
網站上雖然提供了相當詳細的資訊,但呈現的方式
很固定,也可能不符合每個人的期待。
本專題的第一個重點是如何擷取氣象局鄉鎮地區的
氣象資訊,並在整理後儲存於自行架設的 MySQL資料庫中,如此一來使用者就能利用到自己的系統上。
另外,為了使儲存資料能再讓其他平台使用,第二
個重點即是利用免費伺服器資源將資料以 API的方式以 JSON的格式發佈在網路上,讓其他人可以串接進行利用。
實戰:鄉鎮市區 天氣預報及建立 API
. . . . . . . . . . . . . . . . . . . . .....................................
............. .. .. .. .. .. . .
. . . .. . . . . . . . . . . . . . . . . . . . . . . . ............................
...
............. .. .. . .. . .
. . . .. . . . . . ......................................
....................
.......
11Chapter
11-2
Python 大數據特訓班
11.1 專題方向目前國家的氣象預報資料,最小區域單位為縣市,因為範圍較大與居住地的氣象
常有不小誤差。其實氣象局提供了台灣 368 個鄉鎮市區的氣象資料,可以讓使用
者更精準掌握居住地的天氣。本專題將擷取鄉鎮市區氣象資料儲存於 MySQL資
料庫中,並使用 Django 建立 API 傳回鄉鎮市區氣象 JSON 資料的網站,再上傳
到 Heroku 讓所有人都可以使用此 API。
專題檢視
在氣象局的網站中會即時呈現每個鄉鎮市區 48小時的預報資料,每 3 小時更新
一次。本專題 <threeday1.py> 執行後會擷取天氣資料儲存於 MySQL資料庫。儲
存資料時會先檢查資料庫中是否已存在該筆資料,若已存在就跳過該筆資料。
本專題先使用 Django 模組建立網站,完成傳回鄉鎮市區 2 天氣象預報的 JSON
資料 API,再將網站上傳到 Heroku 免費伺服器,讓所有人都可以使用此 API 開
發各種應用程式。
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 筆資料,查詢
鄉鎮市區代碼資料非常困難,需要將其精簡。
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」。