之前撈網站資料都用python的beautiful soup,覺得已經很方便了,不過在sitcon聽講者介紹pandas,發現用它來抓網頁的table更方便快速呀!pandas一樣是python的套件,可以擷取json, csv, excel, html table等等格式的資料。資料型態為DataFrame格式,可以使用index(row)或column存取資料,整理資料的時候相當好用。


開發環境

工欲善其事,必先利其器,這裡使用ipython來協助開發。接著,要安裝pandas套件,不過由於用pandas爬html還需要額外裝lxml,html5lib,在windows安裝時遇到點問題,所以使用mac環境測試。


安裝必要套件

安裝前需要先裝libxml2, libxslt

 $ brew install libxml2
 $ brew install libxslt
 $ brew link libxml2 --force
 $ brew link libxslt --force

接著裝以下套件即可完工

 $ pip install lxml
 $ pip install html5lib
 $ pip install pandas

使用pandas匯入資料

可以匯入csv,excel,html等多種格式,使用方式簡單如下

import pandas as pd
data = pd.read_csv('file.csv')
data = pd.read_excel('file.xls', 'sheet')
data = pd.read_html('url')

檔案讀取進來後,就是要畫圖呈現拉!可以參考pandas網站上的Visualization章節,使用matplotlib API繪圖。這部份就自行點閱 pandas官網

此外,pandas也提供方便的功能,直接顯示統計資訊與相關係數。

data.describe()
data.corr()

(詳情請看炎龍老師的投影片自我學習課程 Python 投影片)


文字編碼問題
讀取中文的時候常常會出現亂碼,原因就是編碼不如預期,比如說utf-8。通常在python檔案前面加上以下文字就能一勞永逸,但有些時候還是會有問題。

# -*- coding: utf-8 -*-

炎龍老師的投影片舉了以下例子,使用raw_input的時候,若沒有加上unicode編碼,輸出就會產生亂碼,改進的方式如下:

name = raw_input(u" 請輸入你的名字: ") 
print " 你好! " + name.decode(s).encode("utf-8") 

範例程式

實測pandas:抓取stockq上的股市資料。

網頁上的資料明顯是一個表格,適合用pandas直接抓取。如下圖:

p3

接著我們直接利用read_html抓取table資料

import pandas as pd
url = 'http://www.stockq.org/market/asia.php'
pd.read_html(url)[4]

p4
這個網頁上有多個table,而我們關注的股市資料放在第五個table中,因此下指令read_html(url)[4],拿到這個table資料。不過仔細一看,居然有287個column?網頁上明明沒有那麼多呀,這裡先不管是不是html寫的問題,我們用drop就把不要的row與column丟掉,留下想要關注的表格!見下圖

import pandas as pd
url = 'http://www.stockq.org/market/asia.php'
table = pd.read_html(url)[4]
table = table.drop(table.columns[[0,1,2,3,4]],axis=0)
table = table.drop(table.columns[9:296],axis=1)
table

p1

爬到表格後,接下來就是處理資料囉~


參考資料

Pandas!資料處理與分析的利器!

自我學習課程 Python 投影片

Cannot install Lxml on Mac os x 10.9