4. Data I/O

Yi-Ju Tseng

Data input and output

  • Data input
    • From file
    • From google drive
    • From API
    • From database
    • Webscrapping
  • Data output

前置作業

為了成功從https (加密封包傳輸)下載資料,首先取消證書驗證

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

Data input and output

  • Data input
    • From file
    • From google drive
    • From API
    • From database
    • Webscrapping
  • Data output

From File

From File

  • .csv 逗號分隔格式檔案
  • .xls Excel格式檔案
  • .pkl pickle格式檔案 python常用
  • 純文字資料
  • 其他格式

.csv 逗號分隔格式檔案

  • .csv 為逗號分隔格式檔案
  • pandasread_csv(路徑),將檔案匯入
  • 路徑可以是本機端路徑,也可以是網址
import pandas as pd
url = "https://quality.data.gov.tw//dq_download_csv.php?nid=102775&md5_url=ea56d6e1f2642b2c5c44f9e8b6185d54"
df_csv = pd.read_csv(url)
df_csv.head()
停車場型態 停車場代碼 停車場名稱 停車場地址 停車場電話 即時車位 一般大型車 一般小型車 身障者小型車 婦幼者小型車 綠能小型車 一般機車 身障者機車 小型車充電樁 收費時間 收費費率 經緯度 備註欄
0 公有免費停車場 044 佳里停1公有停車場 臺南市佳里區安西路與文化路交叉口 2138172 -1 0 11 1 1 1 0 0 0 NaN NaN 23.16238,120.1714 NaN
1 公有免費停車場 045 佳里停2公有停車場 臺南市佳里區文化路與公園路交叉口 2138172 -1 0 8 1 1 1 0 0 0 NaN NaN 23.16293,120.17216 NaN
2 公有免費停車場 100 停2立體停車場 臺南市新市區環東路1段與南科二路 NaN -1 0 417 6 0 0 70 2 0 NaN NaN 23.096305,120.284649 南科管理局
3 公有免費停車場 101 管理局地下停車場 臺南市新市區環東路1段與南科三路 NaN -1 0 402 14 0 0 467 6 0 NaN NaN 23.101229,120.282238 南科管理局
4 公有免費停車場 102 管理局戶外平面停車場 臺南市新市區環東路1段 NaN -1 0 227 2 0 0 46 0 0 NaN NaN 23.102632,120.283831 南科管理局

.csv 逗號分隔格式檔案

停車場型態 停車場代碼 停車場名稱 停車場地址 停車場電話 即時車位 一般大型車 一般小型車 身障者小型車 婦幼者小型車 綠能小型車 一般機車 身障者機車 小型車充電樁 收費時間 收費費率 經緯度 備註欄
0 公有免費停車場 044 佳里停1公有停車場 臺南市佳里區安西路與文化路交叉口 2138172 -1 0 11 1 1 1 0 0 0 NaN NaN 23.16238,120.1714 NaN
1 公有免費停車場 045 佳里停2公有停車場 臺南市佳里區文化路與公園路交叉口 2138172 -1 0 8 1 1 1 0 0 0 NaN NaN 23.16293,120.17216 NaN
2 公有免費停車場 100 停2立體停車場 臺南市新市區環東路1段與南科二路 NaN -1 0 417 6 0 0 70 2 0 NaN NaN 23.096305,120.284649 南科管理局
3 公有免費停車場 101 管理局地下停車場 臺南市新市區環東路1段與南科三路 NaN -1 0 402 14 0 0 467 6 0 NaN NaN 23.101229,120.282238 南科管理局
4 公有免費停車場 102 管理局戶外平面停車場 臺南市新市區環東路1段 NaN -1 0 227 2 0 0 46 0 0 NaN NaN 23.102632,120.283831 南科管理局

Hands-on - .csv檔案匯入

.xls Excel格式檔案

  • 需要安裝openpyxlxlrd套件
!pip3 install openpyxl xlrd

.xls Excel格式檔案

  • 使用pandasread_excel(路徑)
  • 路徑可以是本機端路徑,也可以是網址
  • 可設定sheet_name參數指定工作表名稱
url = 'https://github.com/CGUIM-BigDataAnalysis/BigDataCGUIM/raw/master/EMBA_BigData/Data/%E6%96%B0%E7%AB%B9%E4%B8%8D%E5%8B%95%E7%94%A2.xls'
house = pd.read_excel(url,sheet_name = "不動產買賣")  
house.head()
鄉鎮市區 交易標的 土地位置建物門牌 土地移轉總面積平方公尺 都市土地使用分區 非都市土地使用分區 非都市土地使用編定 交易年月日 交易筆棟數 移轉層次 ... 總價元 單價元平方公尺 車位類別 車位移轉總面積平方公尺 車位總價元 備註 主建物面積 附屬建物面積 陽台面積 電梯
0 新竹市 土地 明湖段840地號 18.74 NaN 山坡地保育區 農牧用地 1121101 土地1建物0車位0 NaN ... 150000 8004.0 NaN 0.0 0 NaN 0.00 0.0 0.00
1 新竹市 土地 新莊段198地號 42.95 NaN NaN NaN 1121101 土地12建物0車位0 NaN ... 4576000 106542.0 NaN 0.0 0 親友、員工、共有人或其他特殊關係間之交易; 0.00 0.0 0.00
2 新竹市 房地(土地+建物) 新竹市新竹市光華街95巷3號5樓之3 6.72 NaN NaN 1121101 土地1建物1車位0 五層 ... 3630000 81665.0 NaN 0.0 0 NaN 31.62 0.0 3.74
3 新竹市 土地 南門段四小段177-25地號 29.67 都市:其他:道路用地 NaN NaN 1121103 土地1建物0車位0 NaN ... 1316221 44362.0 NaN 0.0 0 包含公共設施保留地用地; 0.00 0.0 0.00
4 新竹市 土地 東山段一小段189-11地號 357.38 NaN NaN NaN 1121107 土地1建物0車位0 NaN ... 5038989 14100.0 NaN 0.0 0 協議價購; 0.00 0.0 0.00

5 rows × 31 columns

.xls Excel格式檔案

  鄉鎮市區       交易標的            土地位置建物門牌  土地移轉總面積平方公尺    都市土地使用分區 非都市土地使用分區  \
0  新竹市         土地            明湖段840地號        18.74         NaN    山坡地保育區   
1  新竹市         土地            新莊段198地號        42.95         NaN       NaN   
2  新竹市  房地(土地+建物)  新竹市新竹市光華街95巷3號5樓之3         6.72           住       NaN   
3  新竹市         土地      南門段四小段177-25地號        29.67  都市:其他:道路用地       NaN   
4  新竹市         土地      東山段一小段189-11地號       357.38         NaN       NaN   

  非都市土地使用編定    交易年月日       交易筆棟數 移轉層次  ...      總價元   單價元平方公尺 車位類別  \
0      農牧用地  1121101   土地1建物0車位0  NaN  ...   150000    8004.0  NaN   
1       NaN  1121101  土地12建物0車位0  NaN  ...  4576000  106542.0  NaN   
2       NaN  1121101   土地1建物1車位0   五層  ...  3630000   81665.0  NaN   
3       NaN  1121103   土地1建物0車位0  NaN  ...  1316221   44362.0  NaN   
4       NaN  1121107   土地1建物0車位0  NaN  ...  5038989   14100.0  NaN   

  車位移轉總面積平方公尺  車位總價元                     備註  主建物面積  附屬建物面積  陽台面積 電梯  
0         0.0      0                    NaN   0.00     0.0  0.00  無  
1         0.0      0  親友、員工、共有人或其他特殊關係間之交易;   0.00     0.0  0.00  無  
2         0.0      0                    NaN  31.62     0.0  3.74  有  
3         0.0      0           包含公共設施保留地用地;   0.00     0.0  0.00  無  
4         0.0      0                  協議價購;   0.00     0.0  0.00  無  

[5 rows x 31 columns]

Hands-on - .xls Excel格式檔案

  • 水位雨量站為例
  • 複製Excel資料下載網址
  • 用pandas 的 read_excel()函數將檔案匯入,記得設定工作表名稱
  • 匯入後印出第三個row

.pkl pickle格式檔案

  • python專用,可儲存 python 的工作階段與變數
  • 常用functions
    • dumps, dump:儲存
    • loads, load:讀取
  • 確保使用信任來源的pickle檔案以避免安全風險
  • with ... as ...:可自動在執行完區塊程式後將檔案關閉
import pickle
with open("cash_rate.pkl", 'rb') as f: 
    cash = pickle.load(f) 
    
print(type(cash))
<class 'list'>

純文字資料

  • 使用oepn(檔名)開啟檔案
    • 以sequence形式儲存
  • 使用檔案物件.read()讀取內容。一次取全部
  • 讀取完畢後,使用檔案物件.close()關閉檔案
f = open("output_write.txt")
print(f.read())
f.close()
Hello World123456789Hello World
123
456
789

純文字資料

  • 使用oepn(檔名)開啟檔案
  • 使用檔案物件.readlines()讀取內容。一次取全部,分行存成list
  • 讀取完畢後,使用檔案物件.close()關閉檔案
f = open("output_write.txt")
print(f.readlines())
f.close()
['Hello World123456789Hello World\n', '123\n', '456\n', '789\n']

純文字資料

  • 使用oepn(檔名)開啟檔案
  • 使用檔案物件.readline()讀取內容。逐行讀
  • 讀取完畢後,使用檔案物件.close()關閉檔案
f = open("output_write.txt")
print(f.readline())
print(f.readline())
f.close()
Hello World123456789Hello World

123

dist + for + open

name = 'trump.txt'
handle = open(name)

counts = dict()
for line in handle:
    words = line.split()
    for word in words:
        counts[word] = counts.get(word,0) + 1

bigcount = None
bigword = None
for word,count in counts.items():
    if bigcount is None or count > bigcount:
        bigword = word
        bigcount = count

print(bigword, bigcount)
the 31

其他格式

  • 以圖片為例,需安裝並載入繪圖用套件matplotlib
  • 使用plt.imread(路徑)載入圖片,為RGB向量
!pip3 install matplotlib
import matplotlib
import matplotlib.pyplot as plt
im = plt.imread('figures/nycu_logo.png') 
print(im)
plt.imshow(im, 'gray')
plt.show()
[[[1. 1. 1. 0.]
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]
  ...
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]]

 [[1. 1. 1. 0.]
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]
  ...
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]]

 [[1. 1. 1. 0.]
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]
  ...
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]]

 ...

 [[1. 1. 1. 0.]
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]
  ...
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]]

 [[1. 1. 1. 0.]
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]
  ...
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]]

 [[1. 1. 1. 0.]
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]
  ...
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]
  [1. 1. 1. 0.]]]

其他格式

  • 使用plt.imshow(向量)呈現圖片
  • plt.show()在視窗中呈現圖片內容
plt.imshow(im, 'gray')
plt.show()

Data input and output

  • Data input
    • From file
    • From google drive
    • From API
    • From database
    • Webscrapping
  • Data output

從Google drive匯入

從Google drive匯入 - google 試算表

  • pandas套件
  • 注意原始連結後方,須為文件ID
    • 若有/edit#gid=0/edit?usp=sharing字樣,請刪除
  • 需要加工連結,在原始連結最後加上/export?format=csv
  • 如果不是公開資料表,需要授權
    • 參考google-api-python-client套件
link="https://docs.google.com/spreadsheets/d/1WqkYGfZZinxqhyqnbHIDC4NrHXbApfm8m8EvFR4SPAU"
csv_link="/export?format=csv"
pd.read_csv(link+csv_link)
交易日期 開盤 最高 最低 收盤 漲跌 漲跌(%) 振幅(%) 張數 筆數 ... 外資 投信 自營 合計 外資持股(%) 融資增減 融資餘額 融券增減 融券餘額 券資比(%)
0 25/02/14 1065 1070 1060 1060 -30 -2.75 0.92 73,417 218,986 ... -20,971 -91.4 +34.5 -21,028 73.4 +1,090 23,081 -100 111 0.48
1 25/02/13 1090 1095 1080 1090 -10 -0.91 1.36 35,682 72,456 ... -10,885 +454 +1,117 -9,313 73.5 +262 21,991 -56 211 0.96
2 25/02/12 1110 1115 1100 1100 -10 -0.90 1.35 26,190 38,511 ... +213 -19 -347 -153 73.6 +129 21,729 -4 267 1.23
3 25/02/11 1110 1115 1100 1110 5 0.45 1.36 21,023 31,837 ... +1,229 -353 -292 +584 73.6 -38 21,600 10 271 1.25
4 25/02/10 1125 1125 1095 1105 -20 -1.78 2.67 31,037 60,839 ... -2,271 -132 -479 -2,882 73.6 +532 21,638 -24 261 1.21
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
235 24/02/23 701 703 696 697 5 0.72 1.01 48,404 48,018 ... +20,881 -366 -570 +19,946 74.2 -1,807 13,053 9 392 3.00
236 24/02/22 695 695 685 692 11 1.62 1.47 34,269 36,998 ... +7,728 +37.7 +2,125 +9,890 74.1 +899 14,860 19 383 2.58
237 24/02/21 678 683 678 681 -6 -0.87 0.73 31,981 36,004 ... -5,942 +39.3 +1,514 -4,389 74.0 -145 13,961 -26 364 2.61
238 24/02/20 675 688 675 687 9 1.33 1.92 31,404 32,847 ... +2,641 -12.4 -1,188 +1,441 74.1 -249 14,106 23 390 2.76
239 24/02/19 674 682 674 678 -5 -0.73 1.17 36,367 35,240 ... -10,732 +81.6 +1,855 -8,795 74.0 +616 14,355 -5 367 2.56

240 rows × 22 columns

從Google drive匯入 - google 試算表

交易日期 開盤 最高 最低 收盤 漲跌 漲跌(%) 振幅(%) 張數 筆數 ... 外資 投信 自營 合計 外資持股(%) 融資增減 融資餘額 融券增減 融券餘額 券資比(%)
0 25/02/14 1065 1070 1060 1060 -30 -2.75 0.92 73,417 218,986 ... -20,971 -91.4 +34.5 -21,028 73.4 +1,090 23,081 -100 111 0.48
1 25/02/13 1090 1095 1080 1090 -10 -0.91 1.36 35,682 72,456 ... -10,885 +454 +1,117 -9,313 73.5 +262 21,991 -56 211 0.96
2 25/02/12 1110 1115 1100 1100 -10 -0.90 1.35 26,190 38,511 ... +213 -19 -347 -153 73.6 +129 21,729 -4 267 1.23
3 25/02/11 1110 1115 1100 1110 5 0.45 1.36 21,023 31,837 ... +1,229 -353 -292 +584 73.6 -38 21,600 10 271 1.25
4 25/02/10 1125 1125 1095 1105 -20 -1.78 2.67 31,037 60,839 ... -2,271 -132 -479 -2,882 73.6 +532 21,638 -24 261 1.21
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
235 24/02/23 701 703 696 697 5 0.72 1.01 48,404 48,018 ... +20,881 -366 -570 +19,946 74.2 -1,807 13,053 9 392 3.00
236 24/02/22 695 695 685 692 11 1.62 1.47 34,269 36,998 ... +7,728 +37.7 +2,125 +9,890 74.1 +899 14,860 19 383 2.58
237 24/02/21 678 683 678 681 -6 -0.87 0.73 31,981 36,004 ... -5,942 +39.3 +1,514 -4,389 74.0 -145 13,961 -26 364 2.61
238 24/02/20 675 688 675 687 9 1.33 1.92 31,404 32,847 ... +2,641 -12.4 -1,188 +1,441 74.1 -249 14,106 23 390 2.76
239 24/02/19 674 682 674 678 -5 -0.73 1.17 36,367 35,240 ... -10,732 +81.6 +1,855 -8,795 74.0 +616 14,355 -5 367 2.56

240 rows × 22 columns

從Google drive匯入 - google 試算表

         交易日期    開盤    最高    最低    收盤  漲跌  漲跌(%)  振幅(%)      張數       筆數  ...  \
0    25/02/14  1065  1070  1060  1060 -30  -2.75   0.92  73,417  218,986  ...   
1    25/02/13  1090  1095  1080  1090 -10  -0.91   1.36  35,682   72,456  ...   
2    25/02/12  1110  1115  1100  1100 -10  -0.90   1.35  26,190   38,511  ...   
3    25/02/11  1110  1115  1100  1110   5   0.45   1.36  21,023   31,837  ...   
4    25/02/10  1125  1125  1095  1105 -20  -1.78   2.67  31,037   60,839  ...   
..        ...   ...   ...   ...   ...  ..    ...    ...     ...      ...  ...   
235  24/02/23   701   703   696   697   5   0.72   1.01  48,404   48,018  ...   
236  24/02/22   695   695   685   692  11   1.62   1.47  34,269   36,998  ...   
237  24/02/21   678   683   678   681  -6  -0.87   0.73  31,981   36,004  ...   
238  24/02/20   675   688   675   687   9   1.33   1.92  31,404   32,847  ...   
239  24/02/19   674   682   674   678  -5  -0.73   1.17  36,367   35,240  ...   

          外資     投信      自營       合計 外資持股(%)    融資增減    融資餘額 融券增減 融券餘額  券資比(%)  
0    -20,971  -91.4   +34.5  -21,028    73.4  +1,090  23,081 -100  111    0.48  
1    -10,885   +454  +1,117   -9,313    73.5    +262  21,991  -56  211    0.96  
2       +213    -19    -347     -153    73.6    +129  21,729   -4  267    1.23  
3     +1,229   -353    -292     +584    73.6     -38  21,600   10  271    1.25  
4     -2,271   -132    -479   -2,882    73.6    +532  21,638  -24  261    1.21  
..       ...    ...     ...      ...     ...     ...     ...  ...  ...     ...  
235  +20,881   -366    -570  +19,946    74.2  -1,807  13,053    9  392    3.00  
236   +7,728  +37.7  +2,125   +9,890    74.1    +899  14,860   19  383    2.58  
237   -5,942  +39.3  +1,514   -4,389    74.0    -145  13,961  -26  364    2.61  
238   +2,641  -12.4  -1,188   +1,441    74.1    -249  14,106   23  390    2.76  
239  -10,732  +81.6  +1,855   -8,795    74.0    +616  14,355   -5  367    2.56  

[240 rows x 22 columns]

Hands-on - google 試算表匯入

  • Example Spreadsheet為例
  • 加工連結 (hint:前兩頁投影片)
  • 用pandas 的 pd.read_csv()函數將檔案匯入
  • 匯入後印出第Home State column

從Google drive匯入 - 下載後匯入

使用gdown指令,並輸入google drive 檔案ID

https://drive.google.com/uc?id=1ivP1VeeU0QTdN1pJcudEaIgKO33DMDm7

!gdown '1ivP1VeeU0QTdN1pJcudEaIgKO33DMDm7'

執行後會儲存在工作路徑中,在用相對應的方法匯入即可

Data input and output

  • Data input
    • From file
    • From google drive
    • From API
    • From database
    • Webscrapping
  • Data output

From API

From API

  • Open Data
  • API (Application programming interfaces)
  • JSON格式檔案

Open Data 開放資料

  • 2011年推動開放政府與開放資料 (維基百科)
  • 不受著作權、專利權,以及其他管理機制所限制,任何人都可以自由出版使用
  • 常見的儲存方式為:
    • CSV
    • JSON
    • XML

Open Data 開放資料常見平台

API

  • 應用程式介面
  • Application Programming Interfaces
  • 為了讓第三方的開發者可以額外開發應用程式來強化他們的產品,推出可以與系統溝通的介面
  • 有API輔助可將資料擷取過程自動化
    • 以下載Open Data為例,若檔案更新頻繁,使用手動下載相當耗時
  • 維基百科

API - Open Data

  • [桃園公共自行車即時服務資料]https://opendata.tycg.gov.tw/datalist/5ca2bfc7-9ace-4719-88ae-4034b9a5a55c)資料
  • 每日更新
  • 不可能每日手動下載
  • 提供透過API下載的服務
  • 透過API下載的資料格式: JSON格式

JSON format

  • JSON (Javascript Object Notation)
  • 輕量級的資料交換語言
  • From application programming interfaces (APIs)
  • JavaScript、Java、Node.js應用
  • 一些NoSQL資料庫用JSON儲存資料:MongoDB
  • Wiki

JSON檔案匯入

  • 從網路載資料,需要安裝requests套件
  • 處理json資料,需要安裝與載入json套件
!pip3 install json requests
import json, requests

JSON檔案匯入

  • API網址參考臺中市公共自行車(YouBike2.0)
  • 點選API獲取相關資訊
  • 使用requests套件的get(網址)擷取資料
  • 此API會檔短時間內擷取多次的要求,因此放入params = {'param':'1'}以及headers = {'Connection':'close'}設定
  • 最後將使用回傳結果.json(),將檔案轉成JSON格式
url="https://datacenter.taichung.gov.tw/swagger/OpenData/34a848ab-eeb3-44fd-a842-a09cb3209a7d"
response = requests.get(url, params = {'param':'1'}, headers = {'Connection':'close'})
data = response.json()  # Convert the response to JSON

JSON檔案匯入

探索資料,使用.keys()查看keys

type(data)
dict
data.keys()
dict_keys(['retCode', 'updated_at', 'retVal'])
type(data["retVal"])
list

JSON檔案匯入

探索資料,發現是dist (data)中retVal key儲存含有資料的list

data["retVal"][0:2]
[{'scity': '台中市',
  'scityen': 'Taichung City',
  'sna': 'YouBike2.0_綠川東中山路口',
  'sarea': '中區',
  'ar': '綠川東街/中山路口(東側)',
  'snaen': 'YouBike2.0_Luchuan E. St. / Zhongshan Rd.',
  'sareaen': 'Central Dist',
  'aren': 'Luchuan E. St. & Zhongshan Rd. Intersection (East)',
  'sno': '500601001',
  'tot': '16',
  'sbi': '2',
  'mday': '20250327174231',
  'lat': '24.13785',
  'lng': '120.68337',
  'bemp': '14',
  'act': 1,
  'sbi_detail': {'yb2': '2', 'eyb': '0'}},
 {'scity': '台中市',
  'scityen': 'Taichung City',
  'sna': 'YouBike2.0_繼光光復路口',
  'sarea': '中區',
  'ar': '繼光街166號(對側人行道)',
  'snaen': 'YouBike2.0_Jiguang St. / Guangfu Rd.',
  'sareaen': 'Central Dist',
  'aren': 'No.166, Jiguang St. (Opposite)',
  'sno': '500601002',
  'tot': '18',
  'sbi': '2',
  'mday': '20250327174331',
  'lat': '24.1411',
  'lng': '120.68474',
  'bemp': '16',
  'act': 1,
  'sbi_detail': {'yb2': '2', 'eyb': '0'}}]

JSON檔案匯入

探索資料,發現是dist (data)中retVal key儲存含有資料的list

data["retVal"][0]
{'scity': '台中市',
 'scityen': 'Taichung City',
 'sna': 'YouBike2.0_綠川東中山路口',
 'sarea': '中區',
 'ar': '綠川東街/中山路口(東側)',
 'snaen': 'YouBike2.0_Luchuan E. St. / Zhongshan Rd.',
 'sareaen': 'Central Dist',
 'aren': 'Luchuan E. St. & Zhongshan Rd. Intersection (East)',
 'sno': '500601001',
 'tot': '16',
 'sbi': '2',
 'mday': '20250327174231',
 'lat': '24.13785',
 'lng': '120.68337',
 'bemp': '14',
 'act': 1,
 'sbi_detail': {'yb2': '2', 'eyb': '0'}}

Hands-on - JSON檔案匯入練習

From API - Recap

  • Open Data
  • API (Application programming interfaces)
  • JSON格式檔案 requests.get()下載,.json轉型
  • type()查看資料類別
  • 若為dist,則可使用keys()查看資料擷取方法,並印出來試試看

Data input and output

  • Data input
    • From file
    • From google drive
    • From API
    • From database
    • Webscrapping
  • Data output

From database

From database

  • Database access
    • File system: SQLite
    • Database system: MySQL, MS SQL Server, …etc
  • DuckDB
    • Using file system
    • select data with SQL and pandas!

Databases access - SQLite

File system以SQLite為例,需要先安裝sqlite3套件

!pip3 install sqlite3

Databases access - SQLite

  • dbfile local path for db file or url
  • sqlite3.connect(dbfile) connect to the db file
    • dbfile can be local path or url
  • conn.execute("SQL") execute SQL
  • pd.read_sql_query("SQL") retrieve data with SQL and save as dataframe
  • conn.close() close the connection
import sqlite3
import pandas as pd
dbfile = "chinook.db"
conn = sqlite3.connect(dbfile)
df = pd.read_sql_query("select * from artists", conn)
conn.close()

Databases access - SQLite

print(df)
     ArtistId                                               Name
0           1                                              AC/DC
1           2                                             Accept
2           3                                          Aerosmith
3           4                                  Alanis Morissette
4           5                                    Alice In Chains
..        ...                                                ...
270       271   Mela Tenenbaum, Pro Musica Prague & Richard Kapp
271       272                             Emerson String Quartet
272       273  C. Monteverdi, Nigel Rogers - Chiaroscuro; Lon...
273       274                                      Nash Ensemble
274       275                              Philip Glass Ensemble

[275 rows x 2 columns]

Databases access - MySQL (FYR)

以MySQL為例,需要先安裝mysql-connector-python套件

!pip3 install mysql-connector-python

Databases access - MySQL (FYR)

import mysql.connector
mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  password="yourpassword",
  database="mydatabase"
)
mycursor = mydb.cursor()
mycursor.execute("SELECT name, address FROM table_name")
myresult = mycursor.fetchall()
df = pd.DataFrame(myresult)

DuckDB

  • https://duckdb.org/
  • an open-source column-oriented relational database management system
  • Unlike other embedded databases (SQLite) DuckDB is not focusing on transactional (OLTP) applications and instead is specialized for online analytical processing (OLAP) workloads
  • 需要先安裝pandasduckdb套件
!pip3 install pandas duckdb

DuckDB

  • Load any file with DuckDB
  • Use .csv as an example
  • file_path can be local file path or url
import pandas as pd
import duckdb
file_path = "STOCK_TW_XTAI_2330.csv" 

DuckDB

  • duckdb.connect(database=':memory:') open the connection
  • conn.execute(SQL) execute SQL
    • CREATE, SELECT, etc
  • conn.close() close the connection
conn = duckdb.connect(database=':memory:')   
conn.execute(f"""
    CREATE TABLE TSMC_stock AS 
    SELECT *
    FROM read_csv_auto('{file_path}')
""")
<duckdb.duckdb.DuckDBPyConnection at 0x1261d0d70>

DuckDB

  • conn.execute(SQL) execute SQL
    • CREATE, SELECT, etc
    • SELECT retrieval can be stored in dataframe
  • conn.close() close the connection
  • We need more than a *…. for data preprocessing
df_duckdb = conn.execute("SELECT * FROM TSMC_stock").fetchdf()
conn.close()     
print(df_duckdb)
          Date      Open      High       Low     Close      Volume
0   2025-02-18  1,085.00  1,100.00  1,080.00  1,100.00  22,357,939
1   2025-02-17  1,065.00  1,085.00  1,065.00  1,085.00  36,903,859
2   2025-02-14  1,065.00  1,070.00  1,060.00  1,060.00  70,775,922
3   2025-02-13  1,090.00  1,095.00  1,080.00  1,090.00  34,840,520
4   2025-02-12  1,110.00  1,115.00  1,100.00  1,100.00  24,977,391
..         ...       ...       ...       ...       ...         ...
237 2024-02-23    701.00    703.00    696.00    697.00  47,810,473
238 2024-02-22    695.00    695.00    685.00    692.00  34,122,391
239 2024-02-21    678.00    683.00    678.00    681.00  31,417,539
240 2024-02-20    675.00    688.00    675.00    687.00  30,897,730
241 2024-02-19    674.00    682.00    674.00    678.00  35,158,832

[242 rows x 6 columns]

DuckDB

We need more than a *…. for data preprocessing

conn = duckdb.connect(database=':memory:')   
conn.execute(f"""
    CREATE TABLE TSMC_stock AS 
    SELECT 
        Date,  -- Keep the Date column unchanged
        CAST(REPLACE(Open, ',', '') AS DOUBLE) AS Open,
        CAST(REPLACE(High, ',', '') AS DOUBLE) AS High,
        CAST(REPLACE(Low, ',', '') AS DOUBLE) AS Low,
        CAST(REPLACE(Close, ',', '') AS DOUBLE) AS Close,
        CAST(REPLACE(Volume, ',', '') AS BIGINT) AS Volume
    FROM read_csv_auto('{file_path}')
""")
df_duckdb = conn.execute("SELECT * FROM TSMC_stock").fetchdf()
conn.close()     

DuckDB

print(df_duckdb) 
          Date    Open    High     Low   Close    Volume
0   2025-02-18  1085.0  1100.0  1080.0  1100.0  22357939
1   2025-02-17  1065.0  1085.0  1065.0  1085.0  36903859
2   2025-02-14  1065.0  1070.0  1060.0  1060.0  70775922
3   2025-02-13  1090.0  1095.0  1080.0  1090.0  34840520
4   2025-02-12  1110.0  1115.0  1100.0  1100.0  24977391
..         ...     ...     ...     ...     ...       ...
237 2024-02-23   701.0   703.0   696.0   697.0  47810473
238 2024-02-22   695.0   695.0   685.0   692.0  34122391
239 2024-02-21   678.0   683.0   678.0   681.0  31417539
240 2024-02-20   675.0   688.0   675.0   687.0  30897730
241 2024-02-19   674.0   682.0   674.0   678.0  35158832

[242 rows x 6 columns]

DuckDB

You can also use duckdb.query(SQL).to_df() for data retrieval

Query = '''
SELECT YEAR(Date) AS Year, MONTH(Date) AS Month, AVG(Open) as avg_price, COUNT(Open) AS count 
FROM df_duckdb 
GROUP BY Year, Month
ORDER BY avg_price DESC
'''
df_duckdb2 = duckdb.query(Query).to_df()
df_duckdb2
Year Month avg_price count
0 2025 1 1106.000000 15
1 2025 2 1095.000000 12
2 2024 12 1070.681818 22
3 2024 10 1041.105263 19
4 2024 11 1034.571429 21
5 2024 7 990.476190 21
6 2024 9 948.850000 20
7 2024 8 937.454545 22
8 2024 6 916.000000 19
9 2024 5 829.909091 22
10 2024 4 788.400000 20
11 2024 3 762.380952 21
12 2024 2 689.250000 8

Data input and output

  • Data input
    • From file
    • From google drive
    • From API
    • From database
    • Webscrapping
  • Data output

網頁爬蟲 Webscraping

網頁爬蟲 Webscraping

  • 不是每個網站都提供API
  • 人工複製貼上?!
  • 程式化的方式擷取網頁資料: 網頁爬蟲(Webscraping)Webscraping Wiki
  • 可能耗費很多網頁流量和資源 -很可能被鎖IP
  • 使用beautifulsoup4 套件輔助

網頁爬蟲 Webscraping-beautifulsoup4

需要先安裝beautifulsoup4以及requests套件。

!pip3 install beautifulsoup4 requests
  • 擷取條件的撰寫會因網頁語法不同而有差異
  • 使用Google Chrome開發工具輔助觀察擷取資料的條件
    • 或是按右鍵,點選“檢查”
    • 或使用SelectorGadget輔助
  • 觀察需要擷取的資料所在HTML片段
    • css class, id 等

即時股價爬取

from bs4 import BeautifulSoup
import requests
StockUrl = "https://www.google.com/finance/quote/2330:TPE?hl=zh-TW"
res = requests.get(StockUrl)
soup = BeautifulSoup(res.text, "html.parser")
price = soup.select(".fxKbKc")
price[0].get_text()
'$958.00'

HTML/XML 101

  • Element: <a class=’link’ href=’url’>29.99</a>
  • Start tag: <a>
  • End tag: </a>
  • Attribute屬性: href=’url’, class=’link’
  • Text文字: 29.99

即時股價爬取 - 下載html

  • 使用requests套件的get(網址)函數,輸入網址,將網頁載入python分析環境。
  • 成功載入網頁後,針對該物件,使用.text取得網頁原始碼 (.html)
StockUrl = "https://www.google.com/finance/quote/2330:TPE?hl=zh-TW"
res = requests.get(StockUrl)
res.text[0:1000] ## print first 1000 chars
'<!doctype html><html lang="zh-TW" dir="ltr"><head><base href="https://www.google.com/finance/"><link rel="preconnect" href="//www.gstatic.com"><meta name="referrer" content="origin"><script nonce="SZy96BYnBmXLJGhcLlq0ww">window[\'ppConfig\'] = {productName: \'GoogleFinanceUi\', deleteIsEnforced:  true , sealIsEnforced:  true , heartbeatRate:  0.5 , periodicReportingRateMillis:  60000.0 , disableAllReporting:  false };(function(){\'use strict\';function k(a){var b=0;return function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}}}var l=typeof Object.defineProperties=="function"?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};\nfunction m(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var n=m(this);function p(a,b){if(b)a:{var '

即時股價爬取 - 解析html

  • 使用BeautifulSoup套件提供的解析方法BeautifulSoup(html檔案,格式)
    • 輸入剛剛載回來的html檔案res.text,以及設定格式"html.parser",完成HTML解析
  • 解析後可使用解析後內容.prettify取得排版後的網頁原始碼
soup = BeautifulSoup(res.text, "html.parser")

即時股價爬取 - 搜尋所需element -1

Python 搜尋法,多用於搜尋<>tag內的內容

  • find(tag名稱):
    • 取得第一個符合條件的element
  • find_all(tag名稱)
    • 取得所有符合條件的elements

即時股價爬取 - 搜尋所需element -1

CCS selector 搜尋法,有較多彈性

  • select_one()
    • 取得第一個符合CSS條件的element (class or id等屬性)
  • select()
    • 取得所有符合CSS條件的elements (class or id等屬性)

即時股價爬取 - 搜尋所需element -1

範例:class 包含 fxKbKc

  • select()
    • 取得所有符合CSS條件的elements (class or id等屬性)
  • class=可用.代表
  • id=可用#代表
soup = BeautifulSoup(res.text, "html.parser")
price = soup.select(".fxKbKc")
price
[<div class="YMlKec fxKbKc">$958.00</div>]

即時股價爬取 - 取出需要的資料 -1

  • .get_text()可抓取element內文字
  • .get("屬性名稱")可抓取屬性內容
price[0].get_text()
'$958.00'

即時股價爬取 - 搜尋所需element -2

範例:class 包含 gyFHrc

  • select()
    • 取得所有符合CSS條件的elements (class or id等屬性)
soup = BeautifulSoup(res.text, "html.parser")
price_detail = soup.select(".gyFHrc")
price_detail
[<div class="gyFHrc"><span data-is-tooltip-wrapper="true"><div aria-describedby="i15" class="mfs7Fc" data-tooltip-anchor-boundary-type="2" data-tooltip-x-position="2" jsaction="mouseenter:tfO1Yc; focus:AHmuwe; blur:O22p3e; mouseleave:JywGue; touchstart:p6p2H; touchend:yfqBxc;mlnRJb:fLiPzd;" jscontroller="e2jnoe">前次收盤價</div><div aria-hidden="true" class="EY8ABd-OWXEXe-TAWMXe" id="i15" role="tooltip">最後收盤價</div></span><div class="P6K39c">$980.00</div></div>,
 <div class="gyFHrc"><span data-is-tooltip-wrapper="true"><div aria-describedby="i16" class="mfs7Fc" data-tooltip-anchor-boundary-type="2" data-tooltip-x-position="2" jsaction="mouseenter:tfO1Yc; focus:AHmuwe; blur:O22p3e; mouseleave:JywGue; touchstart:p6p2H; touchend:yfqBxc;mlnRJb:fLiPzd;" jscontroller="e2jnoe">單日股價範圍</div><div aria-hidden="true" class="EY8ABd-OWXEXe-TAWMXe" id="i16" role="tooltip">過去一天內最高價與最低價之間的價格範圍</div></span><div class="P6K39c">$958.00 - $964.00</div></div>,
 <div class="gyFHrc"><span data-is-tooltip-wrapper="true"><div aria-describedby="i17" class="mfs7Fc" data-tooltip-anchor-boundary-type="2" data-tooltip-x-position="2" jsaction="mouseenter:tfO1Yc; focus:AHmuwe; blur:O22p3e; mouseleave:JywGue; touchstart:p6p2H; touchend:yfqBxc;mlnRJb:fLiPzd;" jscontroller="e2jnoe">一年股價範圍</div><div aria-hidden="true" class="EY8ABd-OWXEXe-TAWMXe" id="i17" role="tooltip">過去 52 週內最高價與最低價之間的價格範圍</div></span><div class="P6K39c">$740.00 - $1,160.00</div></div>,
 <div class="gyFHrc"><span data-is-tooltip-wrapper="true"><div aria-describedby="i18" class="mfs7Fc" data-tooltip-anchor-boundary-type="2" data-tooltip-x-position="2" jsaction="mouseenter:tfO1Yc; focus:AHmuwe; blur:O22p3e; mouseleave:JywGue; touchstart:p6p2H; touchend:yfqBxc;mlnRJb:fLiPzd;" jscontroller="e2jnoe">總市值</div><div aria-hidden="true" class="EY8ABd-OWXEXe-TAWMXe" id="i18" role="tooltip">一種估價方法,將公司股價乘以在外流通總股數。</div></span><div class="P6K39c">24.84兆 TWD</div></div>,
 <div class="gyFHrc"><span data-is-tooltip-wrapper="true"><div aria-describedby="i19" class="mfs7Fc" data-tooltip-anchor-boundary-type="2" data-tooltip-x-position="2" jsaction="mouseenter:tfO1Yc; focus:AHmuwe; blur:O22p3e; mouseleave:JywGue; touchstart:p6p2H; touchend:yfqBxc;mlnRJb:fLiPzd;" jscontroller="e2jnoe">平均交易量</div><div aria-hidden="true" class="EY8ABd-OWXEXe-TAWMXe" id="i19" role="tooltip">過去 30 天內平均每天的成交股數</div></span><div class="P6K39c">3966.26萬</div></div>,
 <div class="gyFHrc"><span data-is-tooltip-wrapper="true"><div aria-describedby="i20" class="mfs7Fc" data-tooltip-anchor-boundary-type="2" data-tooltip-x-position="2" jsaction="mouseenter:tfO1Yc; focus:AHmuwe; blur:O22p3e; mouseleave:JywGue; touchstart:p6p2H; touchend:yfqBxc;mlnRJb:fLiPzd;" jscontroller="e2jnoe">本益比</div><div aria-hidden="true" class="EY8ABd-OWXEXe-TAWMXe" id="i20" role="tooltip">目前股價與過去十二個月每股盈餘總和兩者之間的比率,這個比率可反映某檔股票的價格相較於其他股票是高還低</div></span><div class="P6K39c">21.17</div></div>,
 <div class="gyFHrc"><span data-is-tooltip-wrapper="true"><div aria-describedby="i21" class="mfs7Fc" data-tooltip-anchor-boundary-type="2" data-tooltip-x-position="2" jsaction="mouseenter:tfO1Yc; focus:AHmuwe; blur:O22p3e; mouseleave:JywGue; touchstart:p6p2H; touchend:yfqBxc;mlnRJb:fLiPzd;" jscontroller="e2jnoe">股利收益率</div><div aria-hidden="true" class="EY8ABd-OWXEXe-TAWMXe" id="i21" role="tooltip">年股利與目前股價兩者之間的比率,這個比率可用於估計某檔股票的股利報酬率</div></span><div class="P6K39c">1.77%</div></div>,
 <div class="gyFHrc"><span data-is-tooltip-wrapper="true"><div aria-describedby="i22" class="mfs7Fc" data-tooltip-anchor-boundary-type="2" data-tooltip-x-position="2" jsaction="mouseenter:tfO1Yc; focus:AHmuwe; blur:O22p3e; mouseleave:JywGue; touchstart:p6p2H; touchend:yfqBxc;mlnRJb:fLiPzd;" jscontroller="e2jnoe">主要交易所</div><div aria-hidden="true" class="EY8ABd-OWXEXe-TAWMXe" id="i22" role="tooltip">這檔證券的上市交易所</div></span><div class="P6K39c">TPE</div></div>,
 <div class="gyFHrc"><div class="mfs7Fc"><span aria-hidden="true" class="notranslate gnzz8b"><svg class="NMm5M" focusable="false" height="14" viewbox="0 0 24 24" width="14"><path d="M12 6c1.1 0 2 .9 2 2s-.9 2-2 2-2-.9-2-2 .9-2 2-2m0 9c2.7 0 5.8 1.29 6 2v1H6v-.99c.2-.72 3.3-2.01 6-2.01m0-11C9.79 4 8 5.79 8 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4z"></path></svg></span>執行長</div><div class="P6K39c"><ul class="OEHt4c"><li><a class="tBHE4e" href="https://www.google.com/search?q=%E9%AD%8F%E5%93%B2%E5%AE%B6&amp;hl=zh-TW" jslog="166166;ved:2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQlpIKegQIAhBe;track:click" target="_blank">魏哲家</a></li></ul></div></div>,
 <div class="gyFHrc"><div class="mfs7Fc"><span aria-hidden="true" class="notranslate gnzz8b"><svg class="NMm5M" focusable="false" height="14" viewbox="0 0 24 24" width="14"><path d="M19 4h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H5V10h14v10z"></path><path d="M14.5 13a2.5 2.5 0 0 0 0 5 2.5 2.5 0 0 0 0-5z"></path></svg></span>成立時間</div><div class="P6K39c">1987年2月21日</div></div>,
 <div class="gyFHrc"><div class="mfs7Fc"><span aria-hidden="true" class="notranslate gnzz8b"><svg class="NMm5M" focusable="false" height="14" viewbox="0 0 24 24" width="14"><path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zM7 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 2.88-2.88 7.19-5 9.88C9.92 16.21 7 11.85 7 9z"></path><circle cx="12" cy="9" r="2.5"></circle></svg></span>總部</div><div class="P6K39c"><a class="tBHE4e" href="https://www.google.com/maps/place/8%2C%20Li-Hsin%20Rd.%206%2C%20%E6%96%B0%E7%AB%B9%2C%20%E8%87%BA%E7%81%A3%E7%9C%81%2C%20%E5%8F%B0%E7%81%A3?hl=zh-TW" jslog="166166;ved:2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQlpIKegQIAhBe;track:click" target="_blank">臺灣省新竹<br/>台灣</a></div></div>,
 <div class="gyFHrc"><div class="mfs7Fc"><span aria-hidden="true" class="notranslate gnzz8b"><svg class="NMm5M" focusable="false" height="14" viewbox="0 0 24 24" width="14"><path d="M20 4H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h16c1.1 0 2-.9 2-2V6a2 2 0 0 0-2-2zm0 14H4V8h16v10z"></path></svg></span>網站</div><div class="P6K39c"><a class="tBHE4e" href="http://www.tsmc.com/" jslog="166166;ved:2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQlpIKegQIAhBe;track:click" rel="noopener noreferrer" target="_blank">tsmc.com</a></div></div>,
 <div class="gyFHrc"><div class="mfs7Fc"><span aria-hidden="true" class="notranslate gnzz8b"><svg class="NMm5M" focusable="false" height="14" viewbox="0 0 24 24" width="14"><path d="M15 8c0-1.42-.5-2.73-1.33-3.76.42-.14.86-.24 1.33-.24 2.21 0 4 1.79 4 4s-1.79 4-4 4c-.43 0-.84-.09-1.23-.21-.03-.01-.06-.02-.1-.03A5.98 5.98 0 0 0 15 8zm1.66 5.13C18.03 14.06 19 15.32 19 17v3h4v-3c0-2.18-3.58-3.47-6.34-3.87zM9 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2m0 9c-2.7 0-5.8 1.29-6 2.01V18h12v-1c-.2-.71-3.3-2-6-2M9 4c2.21 0 4 1.79 4 4s-1.79 4-4 4-4-1.79-4-4 1.79-4 4-4zm0 9c2.67 0 8 1.34 8 4v3H1v-3c0-2.66 5.33-4 8-4z"></path></svg></span>員工數</div><div class="P6K39c">65,152</div></div>]

即時股價爬取 - 取出需要的資料 -2

  • .get_text()可抓取element內文字
  • .get("屬性名稱")可抓取屬性內容
len(price_detail)
13
for price in price_detail:
  print(price.get_text())
前次收盤價最後收盤價$980.00
單日股價範圍過去一天內最高價與最低價之間的價格範圍$958.00 - $964.00
一年股價範圍過去 52 週內最高價與最低價之間的價格範圍$740.00 - $1,160.00
總市值一種估價方法,將公司股價乘以在外流通總股數。24.84兆 TWD
平均交易量過去 30 天內平均每天的成交股數3966.26萬
本益比目前股價與過去十二個月每股盈餘總和兩者之間的比率,這個比率可反映某檔股票的價格相較於其他股票是高還低21.17
股利收益率年股利與目前股價兩者之間的比率,這個比率可用於估計某檔股票的股利報酬率1.77%
主要交易所這檔證券的上市交易所TPE
執行長魏哲家
成立時間1987年2月21日
總部臺灣省新竹台灣
網站tsmc.com
員工數65,152

即時股價爬取 - 搜尋所需element -3

範例:class 包含 z4rs2b

  • select(): 取得所有符合CSS條件的element (class or id等屬性)
soup = BeautifulSoup(res.text, "html.parser")
news = soup.select(".z4rs2b")
news
[<div class="z4rs2b"><a data-ved="2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQuL8GegQIAhAx" href="https://udn.com/news/story/7251/8634410" jslog="106424;ved:2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQuL8GegQIAhAx;track:click" rel="noopener noreferrer" target="_blank"><div class="Tfehrf"><div class="nkXTJ W8knGc" jsname="GvmPSb"><div class="sfyJob">聯合新聞網</div><div class="cCEUJe"><div class="Adak">20 小時前</div><div class="hVmHve" jsname="iwaAEc"></div></div></div><div class="Yfwt5">轉折點到了? 台積電出現1,043元盤後鉅額交易</div></div></a></div>,
 <div class="z4rs2b"><a data-ved="2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQuL8GegQIAhA1" href="https://finance.ettoday.net/news/2932666" jslog="106424;ved:2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQuL8GegQIAhA1;track:click" rel="noopener noreferrer" target="_blank"><div class="Tfehrf"><div class="nkXTJ W8knGc" jsname="GvmPSb"><div class="sfyJob">ETtoday財經雲</div><div class="cCEUJe"><div class="Adak">6 小時前</div><div class="hVmHve" jsname="iwaAEc"></div></div></div><div class="Yfwt5">台積電千億美元投資 英特爾前執行長基辛格:難重振美國晶片業</div></div></a></div>,
 <div class="z4rs2b"><a data-ved="2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQuL8GegQIAhA5" href="https://www.msn.com/zh-tw/news/world/%E5%AD%A3%E8%BE%9B%E6%A0%BC-%E5%8F%B0%E7%A9%8D%E9%9B%BB%E6%8A%95%E8%B3%87%E4%B8%8D%E6%9C%83%E8%AE%93%E7%BE%8E%E5%9C%8B%E9%87%8D%E8%BF%94%E6%99%B6%E7%89%87%E9%BE%8D%E9%A0%AD/ar-AA1BK8oW?ocid=finance-verthp-feeds" jslog="106424;ved:2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQuL8GegQIAhA5;track:click" rel="noopener noreferrer" target="_blank"><div class="Tfehrf"><div class="nkXTJ W8knGc" jsname="GvmPSb"><div class="sfyJob">MSN</div><div class="cCEUJe"><div class="Adak">4 小時前</div><div class="hVmHve" jsname="iwaAEc"></div></div></div><div class="Yfwt5">季辛格: 台積電投資不會讓美國重返晶片龍頭</div></div></a></div>,
 <div class="z4rs2b"><a data-ved="2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQuL8GegQIAhA7" href="https://tw.stock.yahoo.com/news/%E5%B7%9D%E6%99%AE%E8%A6%81%E6%94%B6%E6%B1%BD%E8%BB%8A%E9%97%9C%E7%A8%85%EF%BC%81%E5%8F%B0%E8%82%A1%E8%B7%8C%E9%80%BE300%E9%BB%9E%E3%80%81%E5%A4%B1%E5%AE%8822000%E9%BB%9E-%E5%8F%B0%E7%A9%8D%E9%9B%BB%E6%8C%AB21%E5%85%83%E8%87%B3959%E5%85%83-010329222.html" jslog="106424;ved:2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQuL8GegQIAhA7;track:click" rel="noopener noreferrer" target="_blank"><div class="Tfehrf"><div class="nkXTJ W8knGc" jsname="GvmPSb"><div class="sfyJob">奇摩股市</div><div class="cCEUJe"><div class="Adak">7 小時前</div><div class="hVmHve" jsname="iwaAEc"></div></div></div><div class="Yfwt5">川普要收汽車關稅!台股跌逾300點、失守22000點 台積電挫21元至959元</div></div></a></div>,
 <div class="z4rs2b"><a data-ved="2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQuL8GegQIAhA_" href="https://www.ctee.com.tw/news/20250327700785-430606" jslog="106424;ved:2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQuL8GegQIAhA_;track:click" rel="noopener noreferrer" target="_blank"><div class="Tfehrf"><div class="nkXTJ W8knGc" jsname="GvmPSb"><div class="sfyJob">工商時報</div><div class="cCEUJe"><div class="Adak">6 小時前</div><div class="hVmHve" jsname="iwaAEc"></div></div></div><div class="Yfwt5">台積電擴大投資亞歷桑那鳳凰城富人區房價年漲逾三成- 房市</div></div></a></div>,
 <div class="z4rs2b"><a data-ved="2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQuL8GegQIAhBB" href="https://www.cna.com.tw/news/aipl/202503260103.aspx" jslog="106424;ved:2ahUKEwje1dDU_amMAxVT40wCHXhVHUQQuL8GegQIAhBB;track:click" rel="noopener noreferrer" target="_blank"><div class="Tfehrf"><div class="nkXTJ W8knGc" jsname="GvmPSb"><div class="sfyJob">中央社 CNA</div><div class="cCEUJe"><div class="Adak">1 天前</div><div class="hVmHve" jsname="iwaAEc"></div></div></div><div class="Yfwt5">日經亞洲:台積電擴大對美投資不可避免但有風險| 政治</div></div></a></div>]

即時股價爬取 - 取出需要的資料 -3

  • .get_text()可抓取element內文字
  • .get("屬性名稱")可抓取屬性內容
len(news)
6
for title_click in news:
  print(title_click.get_text())
聯合新聞網20 小時前轉折點到了? 台積電出現1,043元盤後鉅額交易
ETtoday財經雲6 小時前台積電千億美元投資 英特爾前執行長基辛格:難重振美國晶片業
MSN4 小時前季辛格: 台積電投資不會讓美國重返晶片龍頭
奇摩股市7 小時前川普要收汽車關稅!台股跌逾300點、失守22000點 台積電挫21元至959元
工商時報6 小時前台積電擴大投資亞歷桑那鳳凰城富人區房價年漲逾三成- 房市
中央社 CNA1 天前日經亞洲:台積電擴大對美投資不可避免但有風險| 政治

Hands-on 爬蟲練習

  • Ptt Tech_Job 版
  • 試著爬出所有標題
  • 爬出的第三個標題是?
  • 提示:
    • 下載html requests.get(網址)
    • 解析html BeautifulSoup(下載網頁.text, "html.parser")
    • 搜尋所需element find(tag name), select(css條件)
    • 取出需要的資料 get_text(), get(屬性名稱)

即時股價爬取 - 取出需要的資料 -4

  • .get_text()可抓取element內文字
  • .get("屬性名稱")可抓取屬性內容
for title_click in news:
  print(title_click.find("a").get("href"))
https://udn.com/news/story/7251/8634410
https://finance.ettoday.net/news/2932666
https://www.msn.com/zh-tw/news/world/%E5%AD%A3%E8%BE%9B%E6%A0%BC-%E5%8F%B0%E7%A9%8D%E9%9B%BB%E6%8A%95%E8%B3%87%E4%B8%8D%E6%9C%83%E8%AE%93%E7%BE%8E%E5%9C%8B%E9%87%8D%E8%BF%94%E6%99%B6%E7%89%87%E9%BE%8D%E9%A0%AD/ar-AA1BK8oW?ocid=finance-verthp-feeds
https://tw.stock.yahoo.com/news/%E5%B7%9D%E6%99%AE%E8%A6%81%E6%94%B6%E6%B1%BD%E8%BB%8A%E9%97%9C%E7%A8%85%EF%BC%81%E5%8F%B0%E8%82%A1%E8%B7%8C%E9%80%BE300%E9%BB%9E%E3%80%81%E5%A4%B1%E5%AE%8822000%E9%BB%9E-%E5%8F%B0%E7%A9%8D%E9%9B%BB%E6%8C%AB21%E5%85%83%E8%87%B3959%E5%85%83-010329222.html
https://www.ctee.com.tw/news/20250327700785-430606
https://www.cna.com.tw/news/aipl/202503260103.aspx

即時股價爬取 - 爬連結內的新聞

  • 得到連結後,重複上述步驟
    • 下載html requests.get(網址)
    • 解析html BeautifulSoup(下載網頁.text, "html.parser")
    • 搜尋所需element find(tag名稱), select(css條件)
    • 取出需要的資料 get_text(), get(屬性名稱)

即時股價爬取 - 爬連結內的新聞

首先取得連結list。

補充內容:

  • sequence物件.append()可新增內容至sequence中
url_list = []
title_list = []
for title_click in news:
  url_list.append(title_click.find("a").get("href"))
  title_list.append(title_click.get_text())
print(url_list)
['https://udn.com/news/story/7251/8634410', 'https://finance.ettoday.net/news/2932666', 'https://www.msn.com/zh-tw/news/world/%E5%AD%A3%E8%BE%9B%E6%A0%BC-%E5%8F%B0%E7%A9%8D%E9%9B%BB%E6%8A%95%E8%B3%87%E4%B8%8D%E6%9C%83%E8%AE%93%E7%BE%8E%E5%9C%8B%E9%87%8D%E8%BF%94%E6%99%B6%E7%89%87%E9%BE%8D%E9%A0%AD/ar-AA1BK8oW?ocid=finance-verthp-feeds', 'https://tw.stock.yahoo.com/news/%E5%B7%9D%E6%99%AE%E8%A6%81%E6%94%B6%E6%B1%BD%E8%BB%8A%E9%97%9C%E7%A8%85%EF%BC%81%E5%8F%B0%E8%82%A1%E8%B7%8C%E9%80%BE300%E9%BB%9E%E3%80%81%E5%A4%B1%E5%AE%8822000%E9%BB%9E-%E5%8F%B0%E7%A9%8D%E9%9B%BB%E6%8C%AB21%E5%85%83%E8%87%B3959%E5%85%83-010329222.html', 'https://www.ctee.com.tw/news/20250327700785-430606', 'https://www.cna.com.tw/news/aipl/202503260103.aspx']

即時股價爬取 - 爬連結內的新聞

以第一個新聞連結為例,下載html後,重複步驟,取得本文

res = requests.get(url_list[1])
soup = BeautifulSoup(res.text, "html.parser")
news_full = soup.select("p")
full_text = ""
for news_para in news_full:
  full_text = full_text + news_para.get_text()
print("標題: "+title_list[1] +", 內文:" + full_text)
標題: ETtoday財經雲6 小時前台積電千億美元投資 英特爾前執行長基辛格:難重振美國晶片業, 內文:▲英特爾前執行長基辛格(Pat Gelsinger)。(圖/達志影像/美聯社)記者高兆麟/綜合報導根據外媒金融時報報導,去年年底被迫卸任英特爾執行長的基辛格表示,儘管台積電承諾在美國投資 1000 億美元建立先進製造廠,但這無助於美國恢復其在晶片製造業的全球領先地位。不到一個月前,川普才稱讚台積電的投資是將最先進半導體生產帶回美國的重要里程碑。基辛格表示,如果美國沒有研發,美國就不會擁有半導體領域的領導地位。台積電的所有研發工作都在台灣,他們還沒有宣布要轉移這些工作。不過,基辛格也補充說,川普總統的關稅威脅至少對美國有利,因為它為台積電等晶片製造商提供了更多動力在美國設立工廠。去年年底基辛格離職被廣泛視為公司對其複雜扭虧為盈計畫的否定,該計畫包括試圖重建英特爾的製造基地。本月初被任命的繼任者陳立武則尚未制定策略。這位英特爾前執行長不願透露他是否與英特爾董事們因戰略問題發生爭執,但他表示,在實施五年計畫不到四年的時間裡,他就失去了董事們的信任。他說,當董事會做出方向性改變時,這五年多的時間並還沒有完成。台積電表示,其計畫在美國進行的開發工作只是其已投入生產的製程技術,核心研發仍將留在台灣。基辛格對此表示,除非你在美國設計下一代技術,否則美國就沒有領導地位。
關鍵字:
基辛格
                                        ﹑                                                                            英特爾
分享給朋友:追蹤我們:※本文版權所有,非經授權,不得轉載。[ETtoday著作權聲明]※經濟部投資審議會26日召開第18次會議,會中計核准重大投資案件計8件,包括2件僑外投資、4件對外投資、2件對中國投資,其中,台積電(2330)基於外匯避險成本考量,增資英屬維京群島 TSMC GLOBAL LTD.百億美元也過關。2025-03-27 15:30國發會今(27)日公布2月景氣概況,2月景氣對策信號綜合判斷分數為37分,月增2分,燈號續呈黃紅燈。其中,製造業銷售量指數、批發業營業額因AI需求強勁轉為紅燈,惟加班工時部分受春節因素干擾,以及逢年後服務消費淡季等影響轉為綠燈;領先指標及同時指標續呈上升,顯示當前國內景氣延續溫和成長態勢,仍須密切關注後續變化。2025-03-27 16:17SEMI 國際半導體產業協會於今 (27) 日公布的最新一季全球晶圓廠預測報告(World Fab Forecast)中指出,2025 年全球用於前端設施的晶圓廠設備支出自 2020 年以來連續六年增長,較去年同比上升 2%,來到 1,100 億美元。
2025-03-27 14:35美國總統川普週三(26)日表示,針對「所有非美國製造的汽車」徵收25%的關稅,造成美股4大指數收黑,今(27)日台股重挫300多點,22000點失守,投資專家建議,川普發起關稅戰,恐怕引來報復關稅,在4月中旬之前,關稅利空尚未消化完畢之後,投資人稍安勿躁,宜採取保守、觀望。2025-03-27 14:33北區國稅局今(27)日分享房地合一稅罕見核課案例。小莊(化名)與好友小陳(化名)協議將手中近2000萬元房地產等價交換,想不到小陳申報房地合一稅應納稅金為「0」,而自認沒有金流的小莊未申報房地合一稅,遭國稅局抓出漏稅54萬,連補帶罰課75.6萬元稅金。2025-03-27 14:09COMPUTEX演講嘉賓再曝光!IC設計大廠聯發科(2454)執行長蔡力行將以「從邊緣AI到雲端AI的願景」為題,在COMPUTEX 2025發表主題演講,該演講將於展覽開幕第一天5月20日上午11:00於台北南港展覽館2館7樓舉行。 
2025-03-27 13:41美國總統川普突然宣布對非美製汽車加徵25%關稅,金管會證期局局長黃厚銘今(27)日指出,上千家上市公司中,有22家認為具有重大影響。2025-03-27 13:32繼長江存儲和SanDisk宣布漲價後,美光也跟進調高產品價格,營運前景樂觀,相關概念股表現亮眼。其中,記憶體大廠旺宏傳出捷報,旗下NOR Flash獨家打入輝達GB300供應鏈,帶動其股價今日飆漲逾8%,上攻至最高23.3元,成交量更破10萬張。

2025-03-27 13:32電價審議會將於明(28)日舉行,傳出電價平均調漲6%至8%、但可能會有「緩衝期」,對此,台電董事長曾文生今在節目中表示,過去確實有發生過「電價延後調漲、暫時不做決定」的緩衝期,但對於今年會怎麼做,他真的不知道,還是要等電價審議會拍板。2025-03-27 11:42本土投信第一檔台股主動式ETF要來了!主動式投資專家統一投信將推出「統一台股增長主動式ETF」,已取得基金核准函,預計5/7~5/9開始募集繳款,每股發行價10元,將於4/21起舉辦10場投資說明會與投資人面對面。2025-03-27 15:57一鍵開聽!解放雙手雙眼,隨時隨地掌握新聞,輕鬆接收最新消息!做工哥扛債、木屐當典物,當鋪不只是交易,更是人生百態的縮影!全台好房隨手可得,即賞屋提供即時看房資訊與專業分析,省時省力,輕鬆找到完美家!ETtoday攝影棚提供完整設施與高品質服務,提供創作者最佳支援,滿足你各種拍攝需求!想提升技能卻沒時間?專業師資精心設計每門課程,讓你隨時隨地都可以學習!點擊右上角的星星追蹤ETtoday,讓你一手掌握最即時的時事焦點,輕鬆成為話題大師!

即時股價爬取 - 爬連結內的新聞

for迴圈一次做完所有連結,並轉成pandas data frame

newdf = []
for title_click in news:
  title = title_click.get_text()
  url = title_click.find("a").get("href")
  res = requests.get(url)
  soup = BeautifulSoup(res.text, "html.parser")
  news_full = soup.select("p")
  full_text = ""
  for news_para in news_full:
    full_text = full_text + news_para.get_text()
  add_news = pd.DataFrame({"title":[title],"content":[full_text]})
  newdf.append(add_news)

newdf_pd=pd.concat(newdf)
newdf_pd
title content
0 聯合新聞網20 小時前轉折點到了? 台積電出現1,043元盤後鉅額交易 台股26日再度開高走低,台積電(2330)尾盤被大單摜壓,終場下跌10元收980元。不過,根...
0 ETtoday財經雲6 小時前台積電千億美元投資 英特爾前執行長基辛格:難重振美國晶片業 ▲英特爾前執行長基辛格(Pat Gelsinger)。(圖/達志影像/美聯社)記者高兆麟/綜...
0 MSN4 小時前季辛格: 台積電投資不會讓美國重返晶片龍頭
0 奇摩股市7 小時前川普要收汽車關稅!台股跌逾300點、失守22000點 台積電挫21元至959元 美國總統川普準備徵收汽車關稅,美股主要指數全數下跌,台積電重挫4.09%,台積電台北現股今(...
0 工商時報6 小時前台積電擴大投資亞歷桑那鳳凰城富人區房價年漲逾三成- 房市 如果您看到這個頁面,表示您的網路已遭到停止訪問本網站的權利。本站基於資訊安全以及保護網站內容...
0 中央社 CNA1 天前日經亞洲:台積電擴大對美投資不可避免但有風險| 政治

即時股價爬取 - 爬連結內的新聞

title content
0 聯合新聞網20 小時前轉折點到了? 台積電出現1,043元盤後鉅額交易 台股26日再度開高走低,台積電(2330)尾盤被大單摜壓,終場下跌10元收980元。不過,根...
0 ETtoday財經雲6 小時前台積電千億美元投資 英特爾前執行長基辛格:難重振美國晶片業 ▲英特爾前執行長基辛格(Pat Gelsinger)。(圖/達志影像/美聯社)記者高兆麟/綜...
0 MSN4 小時前季辛格: 台積電投資不會讓美國重返晶片龍頭
0 奇摩股市7 小時前川普要收汽車關稅!台股跌逾300點、失守22000點 台積電挫21元至959元 美國總統川普準備徵收汽車關稅,美股主要指數全數下跌,台積電重挫4.09%,台積電台北現股今(...
0 工商時報6 小時前台積電擴大投資亞歷桑那鳳凰城富人區房價年漲逾三成- 房市 如果您看到這個頁面,表示您的網路已遭到停止訪問本網站的權利。本站基於資訊安全以及保護網站內容...
0 中央社 CNA1 天前日經亞洲:台積電擴大對美投資不可避免但有風險| 政治

Hands-on 爬蟲練習

  • Ptt Tech_Job 版
  • 試著爬出最新的一頁前一頁以及前前一頁的所有標題內文網址
  • 總共爬出幾個標題?
  • 提示:
    • 下載html requests.get(網址)
    • 解析html BeautifulSoup(下載網頁.text, "html.parser")
    • 搜尋所需element find(tag名稱), select(css條件)
    • 取出需要的資料 get_text(), get(屬性名稱)
  • 一頁一頁爬 or for 迴圈都可以

網頁爬蟲 進階版

網頁爬蟲 再想想?

網頁爬蟲 Webscraping - Recap

  • 下載html requests.get(網址)
  • 解析html BeautifulSoup(下載網頁.text, "html.parser")
  • 搜尋所需element find(tag名稱), select(css條件)
  • 取出需要的資料 get_text(), get(屬性名稱)

Data input and output

  • Data input
    • From file
    • From google drive
    • From API
    • From database
    • Webscrapping
  • Data output

資料匯出

資料匯出

  • 文字檔 .txt
  • CSV檔 .csv
  • json檔 .json
  • pickle檔 .pkl

資料匯出 - 文字檔 .txt

  • 首先使用open(檔案名稱)開啟檔案
  • 使用檔案.writelines(資料)寫入內容
  • 檔案.writelines(資料)的資料可以是列表
path = 'output_writeline.txt'
f = open(path, 'w')
lines1 = ['Hello World', '123', '456', '789']
lines2 = ['Hello World\n', '123\n', '456\n', '789\n']
f.writelines(lines1)
f.writelines(lines2)
f.close()

資料匯出 - 文字檔 .txt

  • 首先使用open(檔案名稱)開啟檔案
  • 使用檔案.write(資料)寫入內容
  • 檔案.write(資料)的資料必須是文字
path = 'output_write.txt'
f = open(path, 'w')
for t in lines1:
  f.write(t)
  
for t in lines2:
  f.write(t)

f.close()

資料匯出 - CSV檔 .csv

使用pandas Data frame物件中的.to_csv(檔名)儲存檔案。

house.to_csv("house.csv")

資料匯出 - json檔 .json

使用pandas Data frame物件中的.to_json(檔名)儲存檔案。

DataFrame中一定要有index

house.to_json("house.json")
house
鄉鎮市區 交易標的 土地位置建物門牌 土地移轉總面積平方公尺 都市土地使用分區 非都市土地使用分區 非都市土地使用編定 交易年月日 交易筆棟數 移轉層次 ... 總價元 單價元平方公尺 車位類別 車位移轉總面積平方公尺 車位總價元 備註 主建物面積 附屬建物面積 陽台面積 電梯
0 新竹市 土地 明湖段840地號 18.74 NaN 山坡地保育區 農牧用地 1121101 土地1建物0車位0 NaN ... 150000 8004.0 NaN 0.00 0 NaN 0.00 0.00 0.00
1 新竹市 土地 新莊段198地號 42.95 NaN NaN NaN 1121101 土地12建物0車位0 NaN ... 4576000 106542.0 NaN 0.00 0 親友、員工、共有人或其他特殊關係間之交易; 0.00 0.00 0.00
2 新竹市 房地(土地+建物) 新竹市新竹市光華街95巷3號5樓之3 6.72 NaN NaN 1121101 土地1建物1車位0 五層 ... 3630000 81665.0 NaN 0.00 0 NaN 31.62 0.00 3.74
3 新竹市 土地 南門段四小段177-25地號 29.67 都市:其他:道路用地 NaN NaN 1121103 土地1建物0車位0 NaN ... 1316221 44362.0 NaN 0.00 0 包含公共設施保留地用地; 0.00 0.00 0.00
4 新竹市 土地 東山段一小段189-11地號 357.38 NaN NaN NaN 1121107 土地1建物0車位0 NaN ... 5038989 14100.0 NaN 0.00 0 協議價購; 0.00 0.00 0.00
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2864 新竹市 房地(土地+建物)+車位 新竹市新竹市埔頂三路32號十八樓之9 6.53 NaN NaN 1080326 土地1建物1車位1 十八層 ... 7360000 77553.0 坡道平面 28.88 1200000 預售屋、或土地及建物分件登記案件; 45.68 1.78 4.48
2865 新竹市 房地(土地+建物)+車位 新竹市新竹市埔頂三路36號二十八樓之10 6.44 NaN NaN 1080324 土地1建物1車位1 二十八層 ... 6980000 75472.0 坡道平面 24.86 1100000 預售屋權利轉售,讓渡日期:110年05月13日,權利買賣契約成交價格980萬元。預售屋、或土... 44.84 1.78 4.33
2866 新竹市 房地(土地+建物)+車位 新竹市新竹市埔頂三路2號 20.23 NaN NaN 1080317 土地1建物1車位2 一層,二層 ... 55280000 222072.0 坡道平面 57.76 2700000 預售屋權利轉讓,讓渡日期:108年07月13日,權利買賣契約成交價 5880 萬元。預售屋、... 170.24 0.00 0.00
2867 新竹市 房地(土地+建物)+車位 新竹市新竹市埔頂三路66號 19.96 NaN NaN 1080317 土地1建物1車位2 一層,二層 ... 52180000 212854.0 坡道平面 57.76 2700000 預售屋、或土地及建物分件登記案件; 167.16 0.00 0.00
2868 新竹市 房地(土地+建物)+車位 新竹市新竹市埔頂三路68號 20.23 NaN NaN 1080324 土地1建物1車位2 一層,二層 ... 53280000 213625.0 坡道平面 57.76 2700000 預售屋、或土地及建物分件登記案件; 170.24 0.00 0.00

2869 rows × 31 columns

資料匯出 - pickle檔 .pkl

  • python專用,可儲存 python 的工作階段與變數
  • 常用functions
    • dumps, dump:儲存
    • loads, load:讀取
with open("house.pkl", "wb") as file:
    pickle.dump(house, file)

Hands-on 資料匯出

  • Ptt Tech_Job 版
  • 試著爬出最新一頁的所有標題 (Hint!)
  • 將標題存成一個資料框
  • 儲存標題資料框,檔名為ptt.csv

Hands-on 資料匯出

from bs4 import BeautifulSoup
import requests
import pandas as pd
# step 1 download url
res = requests.get("https://www.ptt.cc/bbs/Tech_Job/index.html")
# step 2 parse html
soup = BeautifulSoup(res.text, "html.parser")
# step 3 select tags/css
title_tags = soup.select(".title a")
print(title_tags)
# step 4 get the data
title_list=[] 
for title in title_tags:
  title_list.append(title.get_text())
[<a href="/bbs/Tech_Job/M.1742982154.A.2D0.html">Fw: [罷免板主] Tech_Job</a>, <a href="/bbs/Tech_Job/M.1742994212.A.8BD.html">[面試] 溢泰實業</a>, <a href="/bbs/Tech_Job/M.1742996077.A.4F3.html">[新聞]馬斯克的機器人發財夢,可能會被中國攔胡</a>, <a href="/bbs/Tech_Job/M.1742998916.A.24D.html">[心得] GG和M勝負已定</a>, <a href="/bbs/Tech_Job/M.1742999269.A.C2A.html">[新聞] 半導體訂單旺 首季製造業估雙位數成長</a>, <a href="/bbs/Tech_Job/M.1743032993.A.746.html">[新聞] 浪潮集團在台子公司 數字雲端近年高薪徵</a>, <a href="/bbs/Tech_Job/M.1743033191.A.26A.html">[新聞] 內部重組持續 戴爾今年裁減10%人力</a>, <a href="/bbs/Tech_Job/M.1743048399.A.C72.html">[請益] 群創離職後的選擇?</a>, <a href="/bbs/Tech_Job/M.1743048724.A.2CA.html">[新聞] 英特爾前CEO基辛格:台積電加碼投資美國 </a>, <a href="/bbs/Tech_Job/M.1743051366.A.BE3.html">[新聞]OpenAI 成本負擔大 現金流量估2029年才轉正</a>, <a href="/bbs/Tech_Job/M.1393646135.A.A28.html">[公告] Tech_Job板板規 2022.05.26更新</a>, <a href="/bbs/Tech_Job/M.1410062073.A.1B6.html">[公告] 置底 檢舉/推薦 文章</a>, <a href="/bbs/Tech_Job/M.1425268790.A.15E.html">[公告] 如何消除退文 轉自Ask板</a>, <a href="/bbs/Tech_Job/M.1585618843.A.D43.html">[情報] 薪資查詢平台</a>, <a href="/bbs/Tech_Job/M.1653574616.A.A15.html">[公告] 板規十五 offer請益文 m文解除申請</a>]

資料匯出 - Recap

  • 文字檔 .txt writelines(內容)
  • CSV檔 .csv pandas_df.to_csv(檔名)
  • json檔 .json pandas_df.to_json(檔名)

References

  • Python for Everybody
    • Some contents are from Python for Everybody, and these contents are Copyright 2010- Charles R. Severance (www.dr-chuck.com) of the University of Michigan School of Information and open.umich.edu and made available under a Creative Commons Attribution 4.0 License.
  • Python Data Science Handbook

Questions?