2016年8月30日 星期二

[機器學習練習] [Machine Learning Practice] 用 Scikit 學習台灣指數趨勢(二)- 爬蟲

上一篇大概講解了期貨的概念

了解期貨是什麼之後,我們就可以來爬我們需要的資料了!

爬取資料必須先看懂 html ,所以這篇是假設大家都會 html 語法下練習。

------------------------------------------------------------------------------------------------------------

Step 3 : 用爬蟲爬資料

稍微講解一下我爬資料的思考架構:

1. 觀察目標網頁原始碼

2. 找出目標資料的放置位置並決定實現爬取的方法

3. 決定爬取資料後的整理架構

4. 爬。

接續上一篇講解,我們先到 台灣期貨交易所-期貨每日交易行情 的網頁,

就可以看到今日的交易行情,再任意空白處點選右鍵並按下 Inspect Element

應該可以看到下圖,


台灣期貨交易所很親切地把資料擺在 table 裡面,所以算是默許你爬資料,

(新加坡國際金融交易所就比較不親切)

我們目標是爬取台灣期指第一天到今天的每天資料。

(沒記錯的話,台灣期指第一天是 1998/07/21)

可以發現,在這邊看當日交易行情的方式是點選上方日期表單,

期貨交易所就會把當日資料丟到 table 裡面。


但這些資料是怎麼放進來呢?


一樣在網頁原始碼裡面,找到 input form 的地方,如下:

可以發現,決定要顯示什麼資料的 input 標籤在這邊,

紅筐內,最下方三個就是改變日期的 input form,

名稱分別為 name = syear; name = smonth; name = sday。




好,這邊我們就要寫一個封包去丟給期貨交易所,跟他提取我們想要的網頁,

再把他丟回來的原始碼爬下來並取出我們要的資料,然後整理到 DataFrame 裡面。

python 安裝方法在這邊分享了 -  


安裝好後或已經設置好環境的,如同上一次練習一樣,打開 sublime。




這邊我們就是要寫一個爬取資料的方法,參數是,年、月、日

這套方法會回傳當天的資料回來。

打入以下原始碼實現:

import requests
from bs4 import BeautifulSoup
from datetime import timedelta, date


def getTodayIndex(year, month, day):
    keys = {'syear': year, 'smonth': month, 'sday': day} # 要傳給期貨交易所的 key
    r = requests.post("http://www.taifex.com.tw/chinese/3/3_1_1.asp", data = keys) # 抓取這個 key 回傳網頁的原始碼
    soup = BeautifulSoup(r.text, "lxml") # 把原始碼做整理

    # 這邊下面講
    soup_data = soup.select('table')[2].select('table')[1].select('td')
    return soup_data

這次爬取的方法,其實已經算比較進階,跟上次河川不一樣。

為什麼這樣說呢?

上次河川資料,是一整排列在原始碼裡面,

所以我們只需要 HTML 的 GET 就可以爬取全部要的資料。

但這次我們需要更新網頁資料再重新爬,所以必須要有 POST 來更新資料。

( 有興趣的人可以自己查查 HTML method )

在最後一段,

soup_data = soup.select('table')[2].select('table')[1].select('td')

這邊就是要取出整個網頁原始碼裡面,你想要知道的資料,對我們來說就是這行,










而在網頁原始碼中,這段資料,被擺在第三個 <table> 中的第二個 <table> 中的 <td>,

這邊大功告成,可以試試看在程式碼裡面加上這段,

print getTodayIndex(2016, 8, 30)

並且在終端機輸入以下,觀看結果。

 python DBriver.py




















我知道有一點亂,但多少看得出我們把每一個 <td> 中的資料都取出來了。

再來呢,就是要寫一個 loop ,去爬取每一天的資料,

可以自己想想看要怎麼寫 loop 去爬每一天資料並且整理。



這一集先到這邊,下一集再講怎麼把資料整理成我們需要的 DataFrame。

------------------------------------------------------------------------------------------------------------

Reference

[1] 期貨 wikipedia

[2] 股票指數 wikipedia

[3] 台灣期貨交易所, http://www.taifex.com.tw/

[4] Codecademy, https://www.codecademy.com/


沒有留言:

張貼留言