在進行網頁資料分析的過程中,除了網頁資訊外,有時也會有檔案資料,供使用者下載使用,像是股市相關的網站,就會有各種不同的財務報表下載,這時候,就可以結合Python網頁爬蟲的特性,來自動化下載檔案資料,協助股市資料的分析實作。
本文就以證券交易所的個股日成交資訊及上市公司季報為例,來分別和大家分享以下兩個常見的Python檔案資料下載方式,包含:
- Python下載檔案資料
- Python網頁爬蟲下載檔案資料及解壓縮
一、Python下載檔案資料
首先,前往證券交易所的個股日成交資訊網頁,如下圖:
截圖取自https://www.twse.com.tw/zh/page/trading/exchange/STOCK_DAY.html
輸入所要分析的日期及股票代碼,並且按下查詢按鈕後,就可以看到「CSV下載」按鈕,如下圖:
截圖取自https://www.twse.com.tw/zh/page/trading/exchange/STOCK_DAY.html
接著,在「CSV下載」按鈕的地方點擊滑鼠右鍵,選擇「檢查」,來檢視它的原始碼,如下圖:
從上圖可以看到檔案的下載連結,而想要利用Python下載檔案資料,就需要使用以下指令安裝Requests套件,發送請求到該網址:
$ pip install requests
安裝完成後,引用Requests模組(Module),並且發送請球,如下範例:
import requests domain_url = 'https://www.twse.com.tw/zh' response = requests.get( f'{domain_url}/exchangeReport/STOCK_DAY?response=csv&date=20210901&stockNo=2330')
接著,將檔案另存到目前的路徑中,如下範例:
import requests domain_url = 'https://www.twse.com.tw/zh' response = requests.get( f'{domain_url}/exchangeReport/STOCK_DAY?response=csv&date=20210901&stockNo=2330') with open('2330.csv', 'wb') as file: file.write(response.content) file.close()
執行結果
二、Python網頁爬蟲下載檔案資料及解壓縮
當想要下載的檔案資料或連結,需要透過網頁操作(點擊)才會出現的話,就會需要搭配使用Python Selenium套件來開發網頁爬蟲,進行網頁資料的下載。
前往證券交易所的上市公司季報網頁,點擊查詢後如下圖:
而實作網頁爬蟲的過程就會需要使用到Requests、Selenium 、BeautifulSoup及Webdriver-Manager(瀏覽器驅動管理)套件,可以利用以下的指令來進行安裝:
$ pip install requests $ pip install selenium $ pip install webdriver-manager $ pip install beautifulsoup4
同樣引用這四個模組(Module)及解壓縮檔案所需的zipfile模組(Module),如下範例:
import requests from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import zipfile
接著,建立Chrome Webdriver物件,並且發送請求到證券交易所的上市公司季報網頁,如下範例第9~11行:
import requests from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import zipfile domain_url = 'https://www.twse.com.tw/zh' browser = webdriver.Chrome(ChromeDriverManager().install()) browser.get( f'{domain_url}/statistics/statisticsList?type=05&subType=225')
由於要點擊查詢按鈕才會出現檔案資料表格,所以就需要定位查詢按鈕元素,可以在查詢按鈕的地方點擊滑鼠右鍵,選擇「檢查」來檢視原始碼,如下圖:
從上圖就能夠知道,可以透過class(樣式類別)名稱來定位查詢按鈕,如下範例第13、14行:import requests from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import zipfile domain_url = 'https://www.twse.com.tw/zh' browser = webdriver.Chrome(ChromeDriverManager().install()) browser.get( f'{domain_url}/statistics/statisticsList?type=05&subType=225') button = browser.find_element_by_class_name('button.search') button.click()
如果想要瞭解更多有關Python Selenium操作網頁元件的方法,可以參考[Python爬蟲教學]學會使用Selenium及BeautifulSoup套件爬取查詢式網頁文章。
有了檔案資料的表格,就可以結合Python BeautifulSoup套件,爬取下載檔案的連結,如下範例第16~23行:
import requests from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import zipfile domain_url = 'https://www.twse.com.tw/zh' browser = webdriver.Chrome(ChromeDriverManager().install()) browser.get( f'{domain_url}/statistics/statisticsList?type=05&subType=225') button = browser.find_element_by_class_name('button.search') button.click() soup = BeautifulSoup(browser.page_source, 'lxml') trs = soup.find('table', {'class': 'grid links'}).find('tbody').find_all('tr') //爬取表格所有列 for tr in trs: filename = tr.find('td').getText().strip().replace('/', '_') //爬取表格的「資料範圍」欄位當做檔案名稱 link = tr.find('a').get('href') //爬取下載檔案連結 response = requests.get(domain_url + link)
接下來,同樣將zip壓縮檔另存到目前的路徑,並且透過zipfile模組(Module)來進行解壓縮,如下範例第25~30行:
import requests from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import zipfile domain_url = 'https://www.twse.com.tw/zh' browser = webdriver.Chrome(ChromeDriverManager().install()) browser.get( f'{domain_url}/statistics/statisticsList?type=05&subType=225') button = browser.find_element_by_class_name('button.search') button.click() soup = BeautifulSoup(browser.page_source, 'lxml') trs = soup.find('table', {'class': 'grid links'}).find('tbody').find_all('tr') //爬取表格所有列 for tr in trs: filename = tr.find('td').getText().strip().replace('/', '_') //爬取表格的「資料範圍」欄位當做檔案名稱 link = tr.find('a').get('href') //爬取下載檔案連結 response = requests.get(domain_url + link) with open(f'{filename}.zip', 'wb') as file: file.write(response.content) file.close() files = zipfile.ZipFile(f'{filename}.zip') files.extractall(r'.') browser.close()
執行結果
三、小結
本文利用證券交易所的個股日成交資訊及上市公司季報網頁來和大家分享使用Python下載檔案資料時,最常使用的實作方法。
當檔案的下載連結無需透過任何的網頁操作就會顯示且有規則,使用Python的Requests套件即可達成,反之,如果檔案的下載連結是動態(隨機)產生或是要經過額外的操作才顯示,則需結合Python Selenium或BeautifulSoup套件來開發網頁爬蟲下載檔案資料。
希望以上的內容對大家有所幫助,如果有其它想要瞭解的網頁下載檔案資料教學,歡迎在底下留言和我分享 :)
如果您喜歡我的文章,別忘了在下面訂閱本網站,以及幫我按五下Like(使用Google或Facebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。
您好!請問批量下載不同股票及不同年份要如何處理?感謝
回覆刪除