廢話不多說 今天要爬的是這個網頁
http://mops.twse.com.tw/nas/t21/sii/t21sc03_107_1_0.html
你可以從公開資訊站進來
如下圖

按查詢後就可以 看到表格了


接下來就是python 的實戰了

##### 首先是讀取資料
import requests
url = 'http://mops.twse.com.tw/nas/t21/sii/t21sc03_107_1_0.html'
r = requests.get(url)                              # 抓取網頁 

from io import StringIO                        #這句不細說了 不清楚地可以回去看系列文3
import pandas as pd

r.encoding = 'big5'                               # 讓pandas可以讀取中文(一般用 'big5' 或是用 'utf-8')
dfs = pd.read_html(StringIO(r.text))     # 稍微不一樣的就只有這句  read_html  

##### 接著是痛苦的資料處理.......

# 第一步  columens 太多了 我們只取我們要的 1:10 
df = df[list(range(10))] 
#這邊用 list(range) 這個寫法 會長出 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 挺方便的
#再來~命名欄位名稱
column_name = df[df[0] == '公司代號']

#接著 因為本來的網頁是依照 不同產業分類的
#但新手小白只想要一個整的table 
#一個 可行的寫法是 我們把 有遇到 "公司代號的那些row找出來"
#那這些row 就會是 該產業的table   <-- 大家可以練習看看

#還有一個可行的寫法是 我們看看 "當月營收"這欄位
#如果 營收不是數字的話... 那我們就把它刪了吧

### 實行如下
# 先將 df 中的當月營收用 .to_numeric 變成數字
# 再用(errors='coerce')這個語法 把不能變成數字的部分以 NaN 取代
# 出現 NaN 的 row 用 .dropna 整行刪除
df['當月營收'] = pd.to_numeric(df['當月營收'], errors='coerce')
df = df.dropna(subset=['當月營收'])     
#df = df.loc[~pd.to_numeric(df['當月營收'], errors='coerce').isnull()]  這個寫法比較直觀可以參考看看

#還有一些怪怪的欄位 叫"合計"
#也是用類似的方法把他刪掉
# 刪除「公司代號」中出現「合計」的行數

df = df.loc[~(df['公司代號'] == '合計')]   #「~」是否定的意思
 


##  index 可以設為 公司代號 和 公司名稱 以後方便我們查找
df = df.set_index(['公司代號', '公司名稱'])
##  然後把其他欄位通通變為我們要的次數字吧~
df = df.apply(pd.to_numeric)
#最後我們看看做完的結果~


###### 存檔!! 用成 csv 和 sqlite3

df.to_csv('test.csv', encoding='utf_8_sig')
df = pd.read_csv('test.csv', index_col=['公司代號','公司名稱'])
df.head()

import sqlite3
conn = sqlite3.connect('test.sqlite3')                                     # 和之前的股價範例是存在同一個檔案裡
df.to_sql('monthly_report', conn, if_exists='replace')             # 分在不同的資料庫 叫 monthly_report

# 讀取 sqlite3 中名為「monthly_report」的 table,並且指定其中欄位名稱為「公司代號」與「公司代號」作為 df 的 indexes
df = pd.read_sql('select * from monthly_report', conn, index_col=['公司代號','公司名稱'])
df.head()
# 成品如下

用 DB Browser 打開

##好啦~ 484很簡單~ 但其實最主要是去觀察 我們要爬的網頁
## 網頁越複雜 就越難處理.....
## 今天就這樣吧 感謝大家收看 
​​​​​​​## 我們下次見~

arrow
arrow

    Markjong001 發表在 痞客邦 留言(2) 人氣()