爬蟲實戰,台股證交所、公開資訊觀測站、鉅亨網-從零開始的Python股票爬蟲教學(三)

從零開始的Python股票爬蟲教學系列文:

前言

這個章節來到Python的最強功能【網頁爬蟲】,這也是數據分析最重要的前菜,大家想想看,要進行數據分析前最重要的是什麼?

當然就是要有數據,而數據的來源通常就是網路上公開的資料,但有些網站沒有提供下載的按鍵,這時候就要解析網頁結構去爬取我們想要的數據,最後將爬蟲寫成每日自動爬取,如此一來就可以進行數據分析的部分囉!

一、爬蟲技巧SOP

二、證交所爬蟲

證交所網站連結:https://www.twse.com.tw/zh/

python_crawler2_101112151608

data為表格型態 ➨ pd.read

import pandas as pd
import requests
import io

# 將json改為csv

url = 'https://www.twse.com.tw/exchangeReport/MI_INDEX?response=csv&date=20220412&type=ALLBUT0999&_=1649743235999'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/111.25 (KHTML, like Gecko) Chrome/99.0.2345.81 Safari/123.36'}

res = requests.get(url,headers=headers)

# 去除指數價格
lines = [l for l in res.text.split('\n') if len(l.split(',"'))>=10]
# 將list轉為txt方便用csv讀取
df = pd.read_csv(io.StringIO(','.join(lines)))
# 將不必要的符號去除
df = df.applymap(lambda s:(str(s).replace('=','').replace(',','').replace('"',''))).set_index('證券代號')
# 將數字轉為數值型態
df = df.applymap(lambda s:pd.to_numeric(str(s),errors='coerce')).dropna(how='all',axis=1)
df

python_crawler1_101112151600

三、公開資訊觀測站爬蟲

公開資訊觀測站網站連結:https://mops.twse.com.tw/mops/web/index

python_crawler1_101112151601
python_crawler1_101112151602

data為表格型態 ➨ pd.read

點選按鈕 ➨ payload

import pandas as pd
import requests
import io

url = 'https://mops.twse.com.tw/server-java/FileDownLoad'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/111.25 (KHTML, like Gecko) Chrome/99.0.2345.81 Safari/123.36'}
payload = {
    'step': '9',
    'functionName': 'show_file2',
    'filePath': '/t21/sii/', # otc
    'fileName': 't21sc03_110_1.csv'
}

res = requests.post(url,data=payload,headers=headers)

res.encoding = 'utf8'
df = pd.read_csv(io.StringIO(res.text))
# 將不必要的符號去除
df = df.applymap(lambda s:str(s).replace(',','')).set_index('公司代號')
# 將數字轉為數值型態
df = df.applymap(lambda s:pd.to_numeric(str(s),errors='coerce')).dropna(how='all',axis=1)
df


四、鉅亨網爬蟲

鉅亨網網站連結:https://www.cnyes.com/

data為表格型態 ➨ pd.read

點選按鈕 ➨ payload

import pandas as pd
import requests
import io

dfs = pd.DataFrame()
# 將所有頁面的df組合
for page in range(1,50):
    url = f"https://www.cnyes.com/twstock/financial2.aspx?pi={page}&param=2021%E5%B9%B412%E6%9C%88&datetype=ALL&market=T"
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/111.25 (KHTML, like Gecko) Chrome/99.0.2345.81 Safari/123.36'}
    payload = {
        'pi': page,
        'param': '2021年12月',
        'datetype': 'ALL',
        'market': 'T'
    }
    res = requests.post(url,data=payload,headers=headers)
    df = pd.read_html(res.text,header=0)[0]
    if df['代碼'][0] == '無相關資料':
        break
    dfs = dfs.append(df)

# 去除不必要的符號
dfs = dfs.applymap(lambda s:str(s).replace(',','')).set_index('代碼')
# 將數字轉為數值型態
dfs = dfs.applymap(lambda s:pd.to_numeric(str(s),errors='coerce')).dropna(how='all',axis=1)
dfs
python_crawler1_101112151606-2

結論

網頁爬蟲實戰的上半篇我們爬的網頁資料大多屬於表格(DataFrame)的形式,這代表通常我們只需要到 Network 內尋找向網站 requests 的 url 和 payload 就可以使用 pandas 套件內的功能去成功索取 data,但有些網站的資料看似使用表格去顯示但卻怎麼爬都爬不到怎麼辦呢?

這就代表我們需要解析網頁原始碼來一筆一筆 data 去做整理,想知道如何去爬這些惱人的網站嗎? 那就不要錯過爬蟲實戰,TradingView/CMoney/Yahoo finance-從零開始的Python股票爬蟲教學(四) !

延伸閱讀:


量化通粉絲社群,一起討論程式交易!

加入LINE匿名群組量化通QuantPass」無壓力討論與分享!

追蹤量化通的粉絲專頁量化通QuantPass」即時獲取實用的資源!

python_course_all_1920X400
Oscar
Oscar

具備多年量化經驗,現於外商基金公司擔任量化交易工程師,研究臺股、期貨、加密貨幣等交易策略及回測系統。擅長使用Python網站爬蟲、資料處理、建構回測系統、風險分析,及資料統計視覺化。曾受邀至國立臺北商業大學擔任業師授課。未來將著重在機器學習、神經網路於投資交易上的應用。

文章: 5

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *