TShopping

 找回密碼
 註冊
搜索
查看: 948|回復: 0
打印 上一主題 下一主題

[轉帖] 程式語言-股票爬蟲 python 3.85 可用

[複製鏈接]
跳轉到指定樓層
1#
發表於 2021-7-8 12:22:13 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
此篇文章使用 Anaconda的 Jupyter寫程式,測試環境 python3.6,事先完成 pandas 及 numpy套件安裝

爬蟲 : (白話文) 把資料抓下來

網路爬蟲 : (白話文) 把網路資料抓下來



這篇簡單介紹如何用『網路公開資訊』把股票資料抓下來

但有一個前提,就是這種資料最好是可以「表格型式」呈現

因為程式一直都不是從無到有自己寫出來的

所以今天我們的原碼,是參考 Finlab量化實驗室 的教學

超簡單台股每日爬蟲教學今天教大家如何下載今日的股價,並從中篩選本益比較低的股票,重點是超簡單,只要15行以內就可以辦到!

先來看大神的程式碼,我們再來拆解

  1. import requests
  2. from io import StringIO
  3. import pandas as pd
  4. import numpy as np
  5. datestr = '20180131'
  6. r = requests.post('http://www.twse.com.tw/exchangeReport/MI_INDEX?response=csv&date=' + datestr + '&type=ALL')
  7. df = pd.read_csv(StringIO("\n".join([i.translate({ord(c): None for c in ' '})
  8.      for i in r.text.split('\n')
  9.      if len(i.split('",')) == 17 and i[0] != '='])), header=0)
複製代碼

介紹套件
  • requests:http客戶端資料庫,用於編寫爬蟲及處理網頁資料
  • StringIO:從本機內部資源讀寫string
  • pandas: 處理載入數據並將其視覺化,常用於數據分析
  • numpy:用於數學運算及資料處理,可將數據轉成array的型式

爬蟲來源

今天要爬的資料是從以下路徑…

台灣證券交易所 > 交易資訊 > 盤後資訊 > 每日收盤行情 >全部(不含權證、牛熊證、可展延牛熊證) > CSV下載

注意:『CSV下載』請按『右鍵』,並『複製連結網址』,最後取得的網址就是我們要爬的資料來源http://www.twse.com.tw/exchangeReport/MI_INDEX?response=csv&date=20181207&type=ALLBUT0999




臺灣證券交易所程式解析
  • 將所需要的套件先導入

  1. import requests
  2. from io import StringIO
  3. import pandas as pd
  4. import numpy as np
複製代碼

2. CSV網址連結的『&date=』後方日期用指定變數的方式置入

3. 用『requests.get』方式將網路資料先下載到本機的記憶體裡

  1. #利用requests下載資料
  2. datestr = '20181207'
  3. r = requests.get('http://www.twse.com.tw/exchangeReport/MI_INDEX?response=csv&date=' + datestr + '&type=ALLBUT0999')
複製代碼

可以看看抓下來的資料長什麼樣子??我們列舉前1000個字串,如下圖



4. 開始拆解dataframe裡的指令,把他們區分五大塊





4.1 aa:創建一個字典,內容為用 ' ' 包住資料

  1. aa = {ord(c): None for c in ' '}
  2. print('aa', aa)
複製代碼


4.2 bb:將導進來的資料用 '\n' 元素換行

  1. bb = r.text.split('\n')
  2. print(bb)
複製代碼



4.3 cc:在每一筆資料中,保留 ' ", '分隔的項目個數等於17(自己可以驗算),及第一個值不等於'=',並利用translate呈現aa裡剩餘的資料

  1. cc = [ i.translate(aa)
  2.        for i in bb
  3.             if len(i.split('",')) == 17 and i[0] != '='
  4.        ]
  5. print("cc", cc)
複製代碼



其實可以分解成兩部分來理解

第一部分:去除項目個數不等於17的資料,但前段資料第1個值還有'='

  1. for i in bb:
  2.     if len(i.split('",'))  == 17 :
  3.         xx = i.translate(aa)
  4.         print('xx',xx)
複製代碼


第二部分:去除第1個值有'='的項目,但前段資料卻不是我們要的

  1. for i in bb:
  2.     if i[0] != '=':
  3.         yy = i.translate(aa)
  4.         print('yy',yy)
複製代碼



4.4 dd:將每一筆資料用換行符號"\n"連在一起形成一個字串

  1. dd = "\n".join(cc)
  2. print('dd',dd)
複製代碼



4.5 ee:將字串放入內存StringIO裡,StringIO只讀字串型別的資料

  1. ee = StringIO(dd)
  2. print('ee',ee)
複製代碼



5. 用pandas裡的read_csv讀取ee裡的資料,並指定第0個值為標題header

補充說明:csv的型式是利用逗號 ’,’來分行,用換行符號 ’\n’來分列

  1. df = pd.read_csv(ee, header=0)
  2. print('df',df)
複製代碼



終於將股價資料下載下來了~~

下面將教學如何用不同條件篩選個股




條件篩選個股教學範例

範例是用本益比<15的條件來篩選

  1. df[pd.to_numeric(df['本益比'], errors='coerce') < 15]
複製代碼




6. to_numeric:因dataframe裡都是string(字串),要將string改成value(數值)才能比大小


7. errors = 'coerce':是因為本益比千位數有逗號,若改成value會出錯,這個指令是讓出錯的地方以NaN型式取代

接下來還有許多變化

8. 可以用sort來排序

  1. df2 = df[pd.to_numeric(df['本益比'], errors='coerce') < 15].sort_values(by=['本益比', '收盤價'])
  2. df2
複製代碼




9. 也可以設定多種條件

  1. df.loc[(pd.to_numeric(df['本益比'], errors='coerce') < 15) & (pd.to_numeric(df['本益比'], errors='coerce') > 5) & (pd.to_numeric(df['收盤價'], errors='coerce') < 30) & (pd.to_numeric(df['成交筆數'], errors='coerce') > 100)]
複製代碼




這次的教學教了
  • 如何網路爬蟲
  • 如何製作資料表格
  • 如何製作csv所需資料型態
  • 如何手動設定自己的篩選條件
  • 還有一堆pandas裡的函數

文章出處

 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-24 02:05 , Processed in 0.095897 second(s), 25 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表