返回列表 上一主題 發帖

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

回復 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

回復 108# koshi0413
python的語法是:「for i in range(15):」,加上換行跟對齊,您這段代碼可以略為修改成
  1. for ta in soup.select('tr')[3:10]:
  2.     for i in range(15):
  3.         print(ta.select("td")[i].text, end='\t')
  4.     print('\n')
複製代碼

TOP

回復  koshi0413
python的語法是:「for i in range(15):」,加上換行跟對齊,您這段代碼可以略為修改成
zyzzyva 發表於 2016-9-13 09:50

忘了您的是2.x版的,數字小的話沒什麼差別,數字大的話range要改成xrange

TOP

回復 119# c_c_lai
一般畫圖都是用matplotlib,在ipython的話只要用「%pylab in」,之後就可以直接plot(x,y)。
test = range(50)
plot(temp)
就畫出一條直線。
畫圖其實我也不熟,可以一起研究一下。
這個網頁的資料滿多的,不知道您是想畫什麼樣的圖表?

TOP

本帖最後由 zyzzyva 於 2016-9-13 13:35 編輯

回復 121# c_c_lai
這裡有看到一個範例,我測試是可以work,正在研究,有興趣的朋友可以一起參考。
https://pythonprogramming.net/candlestick-ohlc-graph-matplotlib-tutorial/
順帶一提,他也有一套python入門的介紹影片,講得很清楚,涵蓋的範圍也滿廣的,我很喜歡。
matplotlib官網也有一些範例,可以一併參考。
http://matplotlib.org/examples/pylab_examples/finance_demo.html

TOP

回復 126# koshi0413
應該是版本的問題,2.7的print語法不太一樣。
試試看:
  1. for ta in soup.select('tr')[3:]:
  2.     for i in xrange(15):
  3.         print '%s' %ta.select('td')[i].text + '\t',
  4.     print '\n'
複製代碼

TOP

回復 132# koshi0413
指定編碼試試看。
deta.to_csv('test1.csv', encoding='utf-8')

TOP

回復 154# koshi0413
不錯的文章,謝謝分享。
大量爬取的時候加進一些sleep很好,避免短時間大量request造成網站過大的負擔。
selenium+phantomJS的組合可以隱形瀏覽器,不過如果不介意,用firefox或chrome也可以。

TOP

回復 157# c_c_lai
您是執行什麼特定指令的時候會當掉還是一開就當掉?
有更新或安裝新的環境或套件嗎?有沒有其他的錯誤訊息?

TOP

回復 159# c_c_lai
在cmd底下執行jupyter kernelspec list有回應嗎?

TOP

        靜思自在 : 【是否發揮了良能?】人間壽命因為短暫,才更顯得珍貴。難得來一趟人間,應問是否為人間發揮了自己的良能,而不要一味求長壽。
返回列表 上一主題