返回列表 上一主題 發帖

[原創] python上市櫃三大法人買賣超日報資料下載

本帖最後由 c_c_lai 於 2016-9-13 09:31 編輯

回復 111# koshi0413
一般應用面來說, sql 資料是可以直接拉資料至 EXCEL 的,再用 EXCEL 來畫製統計圖表。
有些人會將每日每分、甚至每秒的股市紀錄存入至資料庫 (DataBase) ,
如 MS SQL、 Access、 MySQL、 Oracle"、 PostgreSQL 等。
然後再去篩選處理,無論你是使用何種程式語言工具。
這方面你可以向 准提部林、GBKEE、Hsieh 、 ... 等多位版主前輩請益的。

TOP

回復 108# koshi0413
原本也有考慮使用 for 來處哩,但問題出在 print() 執行完後都會送出 Feed。
for ta in soup.select('tr')[3:]:
    for ct in [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]:
        print ta.select("td")[ct].text
但結果為:

TOP

回復 109# lpk187
import io

小弟的套件錯誤,無法執行,而且用 conda install io 裝不起來,太神奇了
下班後再來試 pip install io or easy install io 試試

TOP

回復 110# c_c_lai

c大,只要能達到目的即是好方法,其它相關代碼只是每個人方式不同
zyzzyva大 & lpk187大 為畫表轉出 CSV  這方式很好,對於用EXCEL表格來說是一大好事
何況 c大在vba中挺活躍的^^
vba我也是看著你們的文章慢慢學的~

本來也是想把提取的檔案轉存csv
但看到csv to sql有許多轉碼問題,故才直接從python匯入sql

看到介紹 SQL好像可以多表聯合查詢顯示之類,才去碰的(剛碰,目前只會Python匯入sql,sql 匯出至EXCEL)
不同檔案多表聯合查詢  EXCEL 應該也可以吧?   沒試過,應該要用vba??

請教問一下sql可以拉資料至EXCEL,再用EXCEL畫圖
對於vba畫圖這塊,之後可能要請c大指點了@@
雖然python也可以畫圖,但整合性不知道有沒有差,還沒研究過,所以還是先選最了解的EXCEL來整合

TOP

本帖最後由 c_c_lai 於 2016-9-13 08:42 編輯

回復 106# zyzzyva
回復 109# lpk187
回復 107# koshi0413
zyzzyva 大大, 感激不盡!
還是老問題 , with open('output.csv', 'w', new='', encoding='utf-8') as f: 的
new 真的需要改成 with open('output.csv', 'w', "new"='', encoding='utf-8') as f:
"new" ( 打不出來) 才行。
koshi0413 大大,
我發現這兒使用 pandas 顯示結果雖稍稍耗時,但成果是很漂亮。(很值得參考應用)
#在ipython,dfs[1]就可以取出主要的資料
#dfs[1]
#dfs       #類似 103樓 的結果 (差異點:一個是使用 pandas,另一是應用 BeautifulSoup 處理)
lpk187 大大 ,   
#109樓之解題結果與 100樓 的解答類似,雖第一欄加入了 Counter,但過程使用較多的套件。
我發現使用 requests.post(url, headers=headers, data=payload, stream=True) 不需像 pandas
需菱形加入 deta.columns = ['] 等動作。在 tbl=pd.read_html(res.text) 時,它不會自動帶入嗎?

看了三位的不同佳作,才深深覺得我對 Python 之認識初淺,實在太感謝三位能從不同的角度來探討
共同主題,如此學習者才能深切體會、領受,再次謝謝,這亦是我為何喜愛這個論壇的原因。

TOP

本帖最後由 lpk187 於 2016-9-12 23:46 編輯

回復 103# koshi0413

看來熱衷於python 的同好在這討論區,也蠻多人的
python 的io可以輸出很多格式,csv .xlsx甚至sql都行

當C大開始討論這網址 http://www.twse.com.tw/ch/trading/exchange/MI_MARGN/MI_MARGN.php
就在想,表格還是交給表格專家 pandas 來處理,於是借了你大部份代碼來做看看,效果還不錯
  1. import requests
  2. from bs4 import BeautifulSoup
  3. import pandas as pd
  4. import io

  5. url = 'http://www.twse.com.tw/ch/trading/exchange/MI_MARGN/MI_MARGN.php'
  6. headers = {"User-Agent":"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"}
  7. url1 = "http://www.twse.com.tw/ch/trading/exchange/MI_MARGN/MI_MARGN.php"
  8. payload = {"download":'',
  9.             "qdate":'105/09/10',
  10.             "selectType":"ALL"}
  11. res = requests.post(url1, headers=headers, data=payload)
  12. tbl=pd.read_html(res.text)

  13. deta=tbl[1]
  14. deta.columns = ['股票代號','股票名稱','買進','賣出','現金償還','前日餘額','今日餘額','限額','買進','賣出','現券償還','前日餘額','今日餘額','限額','資券互抵','註記']
  15. deta.to_csv('test1.csv')
複製代碼

TOP

對了   個人覺的這段可以像vba一樣用 i = 1 to 14 來迴圈表示
只是還不會用

for ta in soup.select('tr')[3:]:
    print ta.select("td")[0].text,ta.select("td")[1].text,ta.select("td")[2].text,ta.select("td")[3].text,ta.select("td")[4].text,ta.select("td")[5].text,ta.select("td")[6].text,ta.select("td")[7].text,ta.select("td")[8].text,ta.select("td")[9].text,ta.select("td")[10].text,ta.select("td")[11].text,ta.select("td")[12].text,ta.select("td")[13].text,ta.select("td")[14].text

TOP

回復 104# c_c_lai

soup.select('table')[1] 為何是 [1]?
網頁代碼中,取第二個'table'

soup.select('tr')[3:] 的 [3:]
網頁代碼中,取第三個'tr'

第一、二個為標題,小弟直接匯入sql,所以不需要這二項目,所以沒提取~~
z大有最新回文,他的代碼比較正確,小弟的代碼都是簡易型的,只要取到資料能導入sql即可

TOP

回復 102# c_c_lai
提供另一種方式給您參考(解析網頁後處理資料再存成csv)
  1. import requests
  2. from bs4 import BeautifulSoup
  3. import csv

  4. headers = {"User-Agent":"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"}
  5.            
  6. url = 'http://www.twse.com.tw/ch/trading/exchange/MI_MARGN/MI_MARGN.php'

  7. myDate = '105/09/08'

  8. payload={'download':'',
  9.         'qdate':myDate,
  10.         'selectType':'ALL'}

  11. res = requests.post(url, headers=headers, data=payload)
  12. soup = BeautifulSoup(res.text, 'lxml')

  13. trs = soup.select('table tr')

  14. myList = []
  15. subList = []

  16. header1 = ['股票代號','股票名稱','融資(單位: 交易單位)','','','','','',
  17.             '融券(單位: 交易單位)','','','','','','資券互抵','註記']

  18. header2 = ['','','買進','賣出','現金償還','前日餘額','今日餘額','限額',
  19.             '買進','賣出','現金償還','前日餘額','今日餘額','限額','','']

  20. for i, tr in enumerate(trs):
  21.     if i == 6:
  22.         subList = header1
  23.     elif i == 7:
  24.         subList = header2
  25.     else:
  26.         for td in tr.find_all('td'):
  27.             subList.append(td.text)
  28.    
  29.     myList.append(subList)
  30.     subList = []
  31.     if i == 5:
  32.         myList.append(subList)

  33. with open('output.csv', 'w', new='', encoding='utf-8') as f:
  34.     f.write('\ufeff')
  35.     w = csv.writer(f)
  36.     for sub in myList:
  37.         w.writerow(sub)
複製代碼
如果不求美觀,可以直接用pandas:
  1. import requests
  2. import pandas as pd

  3. headers = {"User-Agent":"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"}
  4.            
  5. url = 'http://www.twse.com.tw/ch/trading/exchange/MI_MARGN/MI_MARGN.php'

  6. myDate = '105/09/07'

  7. payload={'download':'',
  8.         'qdate':myDate,
  9.         'selectType':'ALL'}

  10. res = requests.post(url, headers=headers, data=payload)

  11. dfs = pd.read_html(res.text)

  12. #在ipython,dfs[1]就可以取出主要的資料
  13. dfs[1]
複製代碼

TOP

回復 103# koshi0413
您這麼短的時間已經可以抓到資料了,上手的真快。
用BeautifulSoup會試誤是正常的,我也常常都試好幾次才找到。

TOP

        靜思自在 : 小事不做、大事難成。
返回列表 上一主題