### ch5-1 from tkinter import Tk # 從標準函式庫的 tkinter 套件匯入 Tk 類別 win = Tk() # 用 Tk() 類別來建立視窗物件 win win.mainloop() # 用 win 的 mainloop() 方法來顯示視窗,並進入等待使用者操作的迴圈 ### ch5-2 import requests # 匯入 requests 套件 from bs4 import BeautifulSoup # 從 bs4 套件匯入 BeautifulSoup 類別 (可用來解析網頁資料) page = requests.get("http://www.flag.com.tw") # 用 regueset 的 get() 讀取網頁資料 soup = BeautifulSoup(page.text, "html.parser") # 建立 BeautifulSoup 類別的物件,叫做 soup,建立時有加入參數 print(soup.title) # 輸出 soup 的 title 屬性內容 ### ch5-3:自定義 mdu.py 模組 ### 產生一個新檔,名稱為 mdu.py var = 1 def fun(): print('mdu.fun() 已執行') print('mdu 模組已執行並匯入') ### 新增一個 .py 檔,需與 mdu.py 同一個資料夾裡,然後執行以下程式: ### 匯入 mdu 模組 >>> import mdu >>> mdu.var >>> mdu.fun() ### 匯入 mdu 模組的函式 fun() >>> from mdu import fun >>> fun() ### 匯入 mdu 模組的所有東西 >>> from mdu import * >>> var >>> fun() ### ch5-4:自定義 pkg 套件,先新增一個資料夾 pkg ### 在資料夾 pkg 產生一個新檔,名稱為 __init__.py i_var = 2 def i_fun(): print('pkg.__init__.i_fun() 已執行') print('pkg.__init__ 模組已執行並匯入') ### 在資料夾 pkg 產生一個新檔,名稱為 mdp.py var = 3 def fun(): print('pkg.mdp.fun() 已執行') print('pkg.mdp 模組已執行並匯入') ### 匯入 pkg (預設模組為 __init__.py) >>> import pkg # 匯入 pkg\__init__.py >>> pkg.i_var >>> pkg.i_fun() ### 匯入 pkg 套件的 mdp 模組 >>> from pkg import mdp # 匯入 pkg\mdp.py >>> mdp.var >>> mdp.fun() ### 匯入 pkg 套件中,mdp 模組的函式 fun() >>> from pkg.mdp import fun # 匯入 pkg\mdp.py 的函式 fun() >>> fun() ### ch5-5 (5-0.py) import requests # 匯入 requests 套件 r = requests.get('http://www.flag.com.tw') # 向旗標網站發出 GET 請求,並將回應物件儲存到 r if r.status_code == 200: # 回應的狀態碼若為 200 表示 OK print(r.text) # 將回應的文字 (網頁原始碼) 印出來 else: print(r.status_code, r.reason) # 若發生錯誤 (狀態碼不是 200),則印出狀態碼及錯誤原因 ### ch5-6 (5-1.py) import requests url = 'https://httpbin.org/get' hd = {'user-key': '7ADGS9S'} # 標頭參數(以字典儲存) pm = {'id': 1023, 'neme': 'joe'} # 網址參數(以字典儲存) r = requests.get(url, headers = hd, params = pm) # 加入 headers 及 params 參數 print(r.text) # 將回應的文字印出來 ### ch5-7 (5-2.py) import requests url = 'http://httpbin.org/post' # 使用測試服務網站, POST 方法網址要加 /post r = requests.post(url, data = 'Hello') # 送出字串資料 print(r.text) r = requests.post(url, data = {'id':'123', 'name':'Joe'}) print(r.text) ### ch5-8 (5-3.py) import requests r = requests.put('https://httpbin.org/put', data = {'key':'abc'}) print(r.text) r = requests.patch('https://httpbin.org/patch', data = {'key':'xyz'}) print(r.text) r = requests.delete('https://httpbin.org/delete') print(r.text) ### ch5-9 (5-4.py) page = """ 旗標科技
旗標圖示

產品類別

""" from bs4 import BeautifulSoup bs = BeautifulSoup(page, 'lxml') ### ch5-10 (續 5-4.py):以標籤做為 bs 物件的屬性來查詢資料 >>> print(bs.title) >>> print(bs.a) >>> print(bs.a.text) >>> print(bs.a.get('href')) >>> print(bs.a['href']) ### ch5-11 (續 5-4.py):使用 find() 方法 >>> print(bs.find('h4')) >>> print(bs.find('h4', {'class': 'pk'})) >>> print(bs.find('h4').text) ### ch5-12 (續 5-4.py):使用 find_all() 方法 >>> print(bs.find_all('h4')) >>> print(bs.find_all('h4', {'class': 'pk'})) >>> print(bs.find_all(['title', 'p'])) >>> print(bs.find_all(['title', 'p'])[1].text) # 傳回第 1 個 (由 0 算起) 符合標籤中的文字 ### ch5-13 (續 5-4.py):使用 select() 方法 >>> print('h4:', bs.select('h4')) # 查詢所有 h4 標籤 >>> print('#book:', bs.select('#books')) # 查詢所有 id 為 'books' 的標籤 >>> print('.pk:', bs.select('.pk')) # 查詢所有 class 為 'pk' 的標籤 >>> print('h4.bk', bs.select('h4.bk')) # 查詢所有 class 為 'bk' 的 h4 標籤 ### ch5-14 (續 5-4.py):使用 select() 方法,針對多層套疊的標籤 >>> print(bs.select('#main button .pk')) >>> print(bs.select('#main button .pk')[1].text) >>> print(bs.select('#footer a')[0]['href']) ### ch5-15:用 re 模組以「常規表達式」來搜尋字串 https://pythex.org conda install selenium https://sites.google.com/a/chromium.org/chromedriver/downloads from selenium import webdriver # 匯入 selenium 的 webdriver from time import sleep # 匯入內建 time 模組的 sleep() 函式 browser = webdriver.Chrome() # 建立 Chrome 瀏覽器物件 browser.get('http://www.flag.com.tw') # 開啟 Chrome 並連到 Google 網站 sleep(5) browser.close() ### ch5-16 (5-5.py):用 re 模組以「常規表達式」來搜尋字串 import re # 使用前要先匯入 re 模組 print(re.match (r'pyt', 'python')) # pyt 由開頭即符合, 因此成功 print(re.match (r'yth', 'python')) # yth 與開頭不符合, 因此失敗 print(re.search(r'yth', 'python')) # seach( ) 不限開頭, 因此成功 ### ch5-17 (5-6.py):用 re 模組以「常規表達式」來搜尋字串 import re m = re.search(r'p[a-z]+e', 'apples') print(m) # 輸出 <_sre.SRE_Match object; span=(1, 5), match='pple'> print(m.group()) # 輸出 pple print(m.start()) # 輸出 1 print(m.end()) # 輸出 5 注意!pple 的位置是 1~4 print(m.span()) # 輸出 (1, 5) ### ch5-18:sub():將找到的子字串置換為另一個字串 import re print(re.sub(r"[0-9]", '#', "a1b23c456d")) ### ch5-19:用 compile() 來提升多次搜尋的效率 import re ptn = re.compile(r'[0-9]+') print(ptn.search('a1b23c456d').group()) print(ptn.findall('a1b23c456d')) print(ptn.sub('#', 'a1b23c456d')) ### ch5-20:安裝 Selenium 套件與 WebDriver 程式 >>> conda install selenium ### ch5-21 (5-8.py):建立瀏覽器物件來操控 Chrome from selenium import webdriver # 匯入 selenium 套件的 webdriver 子套件 from time import sleep browser = webdriver.Chrome() # 用 webdriver 的 Chrome 類別建立瀏覽器物件 browser.get("http://www.flag.com.tw") # 開啟 Chrome,並連到旗標網站 sleep(5) browser.close() # 關閉網頁 (目前分頁) ### ch5-22 (5-9.py) from selenium import webdriver # 匯入 selenium 的 webdriver from time import sleep # 匯入內建 time 模組的 sleep() 函式 browser = webdriver.Chrome() # 建立 Chrome 瀏覽器物件 browser.get('http://www.google.com') # 開啟 Chrome 並連到 Google 網站 print('標題:' + browser.title) # 輸出網頁標題 print('網址:' + browser.current_url) # 輸出網頁網址 print('內容:' + browser.page_source[0:50]) # 輸出網頁原始碼的前 50 個字 print('視窗:', browser.get_window_rect()) # 輸出視窗的位置及寬高 browser.save_screenshot('d:/scrcap.png') # 截取網頁畫面 sleep(3) # 暫停 3 秒 browser.set_window_rect(200, 100, 500, 250) # 改變視窗位置及大小 sleep(3) browser.fullscreen_window() # 將視窗設為全螢幕 sleep(3) browser.quit() # 關閉視窗結束驅動 ### ch5-23 (5-10.py) from selenium import webdriver # 匯入 selenium 的 webdriver browser = webdriver.Chrome() # 建立 Chrome 瀏覽器物件 browser.get('http://www.google.com') # 開啟 Chrome 並連到旗標網站 e1 = browser.find_element_by_tag_name('head') # 尋找 head 標籤 print(e1.tag_name) # 輸出 head 確認已找到 (tag_name 屬性為標籤名稱, 詳見下表) e2 = e1.find_element_by_tag_name('title') # 在 head 元素中尋找 title 標籤 print(e2.tag_name) # 輸出 tite 確認已找到 browser.quit() # 關閉視窗結束驅動 ### ch5-24 (5-11.py) from selenium import webdriver # 匯入 selenium 的 webdriver opt = webdriver.ChromeOptions() # 建立選項物件 opt.add_experimental_option('prefs', # 在選項物件中加入「禁止顯示訊息框」的選項 {'profile.default_content_setting_values': {'notifications' : 2}}) browser = webdriver.Chrome(options = opt) # 以 options 指名參數來建立瀏覽器物件 browser.get('http://www.facebook.com') # 開啟 Chrome 並連到 fb 網站 browser.find_element_by_id('email').send_keys('您的帳號') # 輸入帳號 browser.find_element_by_id('pass').send_keys('您的密碼') # 輸入密碼 browser.find_element_by_id('loginbutton').click() # 按登入鈕 ### ch5-25 (5-12.py) from selenium import webdriver # 匯入 selenium 的 webdriver from time import sleep # 匯入內建的 time 模組的 sleep() 函式 opt = webdriver.ChromeOptions() # 建立選項物件 opt.add_experimental_option('prefs', # 加入「禁止顯示訊息框」的選項 {'profile.default_content_setting_values': {'notifications' : 2}}) browser = webdriver.Chrome(options = opt) #以 options 參數來建立瀏覽器物件 browser.get('http://www.google.com') # 開啟 Chrome 並連到 Google 網站 browser.maximize_window() # 將視窗最大化以避免最右邊的登入鈕沒顯示出來 browser.find_element_by_id('gb_70').click() # 按登入鈕 sleep(3) # 暫停 3 秒,等待進入下一頁 browser.find_element_by_id('identifierId').send_keys('您的帳號') # 輸入帳號 browser.find_element_by_id('identifierNext').click() # 按繼續鈕 sleep(3) # 暫停 3 秒,等待進入下一頁 browser.find_element_by_name('password').send_keys('您的密碼') #輸入密碼 browser.find_element_by_id('passwordNext').click() # 按繼續鈕