2017-04-09

[Python] 如何抓取Yahoo奇摩的個股成交股價

今天花了許多時間在找如何抓個股成交股價,理論上應該要從台灣證卷交易所的網頁抓才是源頭,但我比較熟悉Yahoo股票的操作頁面,所以決定還是用網頁爬蟲的方式來抓資料。由於網頁資料分析必須先知道網頁原始碼的格式,因此如果原始碼格式改了,資料分析就有可能錯誤,因此往後有可能需要持續更新分析方式。


Blogger不能使用程式的顯示格式,為了方便閱讀,我只好把程式弄成圖檔如下

Python程式碼

Yahoo網頁格式
Yahoo網頁原始碼


以下是程式說明

  1. Yahoo股市
    1. 目前網址格式是https://tw.stock.yahoo.com/q/q?s=STOCKID,STOCKID是股票代號,例如中華電的代號是2412
    2. 抓網頁時一定要有headers,否則Yahoo會回傳查詢錯誤的網頁回來。headers包含Content-type、Accept、User-Agent,這三個我不懂什麼意思,照抄即可。User-Agent看似跟作業系統有關,但是我在MAC OS實測用Windows的User-Agent是可以的
  2. 使用到的libarary有httplib2BeautifulSoup,都需要額外下載
    1. httplib2: 用來抓取網頁內容用,在MAC OS我是用MAC Port下載,指令是sudo port install py27-httplib2
    2. BeautifulSoup: 用來分析網頁內容用,在MAC OS我是用MAC Port下載,指令是sudo port install py27-beautifulsoup4
  3. 使用httplib2的request()可以抓到整個網頁內容,存到doc這個變數裡
  4. 以Yahoo的網頁格式來看,我以「成交」當成是關鍵字
    1. findAll(text='成交')[0]搜尋整個網頁第一個出現「成交」的地方
    2. 以原始碼來看,「成交」出現的上一層是th,上一層是tr,再上一層是table,因此可用parent往上找三層,便可抓出整張table的網頁資料
    3. 以原始碼來看,成交價格是在第二個tr的第三個td,因此可用table.select('tr')[1].select('td')[2].text抓出成交價

1 則留言:

  1. resp在python 3 似乎不能用了。 而且result 只會回傳 STOCKID

    回覆刪除