ªð¦^¦Cªí ¤W¤@¥DÃD µo©«

python ¿Ä¸ê¿Ä¨é·JÁ` (¥þ³¡)"¸ê®Æ

python ¿Ä¸ê¿Ä¨é·JÁ` (¥þ³¡)"¸ê®Æ

ÁÙ¤£·|»s§@°õ¦æÀÉ¡I¨ä¤º®e¶È¨Ñ°Ñ¦Ò¤§
  1. #-*- coding:utf-8 -*-

  2. '''
  3. ¥»µ{§Ç¥Ñ Python 3.52 ¼g¦¨¡A¬°§@ªÌ°Ñ¦Ò³Â»¶®a±Ú°Q½×°Ï "python¤W¥«Âd¤T¤jªk¤H¶R½æ¶W¤é³ø¸ê®Æ¤U¸ü" °Q½×¤º®e½m²ß
  4. ¨ä¤º®e¤j³¡¥÷°Ñ¦Ò zyzzyva¤j¤j¡Bc_c_lai ¤j¤j ¡Bkoshi0413 ¤§°Q½×¤º®e¡A·PÁ¡I
  5. ¥»µ{§Ç·|¦Û°Ê¥Í¦¨ Access ªº twsedata.mdb¸ê®Æ®w¡A¤Î«Ø¥ß¦U©Ò»Ý¤§¸ê®Æªí¡A¦ý¥u¯à¤U¸ü"¿Ä¸ê¿Ä¨é·JÁ` (¥þ³¡)"¸ê®Æ
  6. £°¡I¨S¦³«H¥Î¥æ©ö²Î­p¸ê®Æ ¡A¥u«Ø¥ß¨ä¸ê®Æªí
  7. ¥»µ{§Ç»Ý­n pip ¦w¸Ë requests ¡BBeautifulSoup4¡Bpypyodbc
  8. ¥H¤Î»Ý¤U¸ü pywin32 : https://sourceforge.net/projects/pywin32/files/pywin32/Build%20220/
  9. ¨Ï¥Î¤èªk¡G¥u¦b input ®É ¡A¿é¤J¶}©lÂ^¨ú¤é´Á¤Îµ²§ôÂ^¨ú¤é´Á§Y¥i¡A²Ä¤@¦¸°õ¦æ®É¡A·|«Øºc¸ê®Æ®w¡A¦Ó«á¥u¼W¥[¸ê®Æ¡A
  10. ¨C¤é¸ê®ÆÂ^¨ú¨ìÀx¦s¦Ü¸ê®Æ®wªº®É¶¡¬ù 21¬í(¨Ì§@ªÌ¹q¸£°õ¦æ­p®É )
  11. ¥»µ{§Ç¶È¨Ñ°Ñ¦Ò¡A¤£­t³d§ó·s¤º®e¡A¤£­t³d°£¿ù(¦]¬°§Ú¤]¬O·s¤â¡A°£¿ù¹ï§Ú¨Ó»¡¤Ó#%%$...)¡A·dÃa¨Ï¥ÎªÌ¹q¸£¡A¤]¤£Ãö§@ªÌªº¨Æ¡I¡I
  12. §@ªÌ¡G³Â»¶®a±Ú°Q½×°Ï lpk187
  13. §¹¦¨¤é´Á¡G2016/9/22
  14. '''

  15. import requests
  16. from bs4 import BeautifulSoup
  17. import random
  18. import os
  19. import win32com.client
  20. import pypyodbc
  21. import datetime
  22. import time

  23. # ÀH¾÷§ó§ï headers
  24. def head_random():
  25.       for i in range(10):
  26.             hs = ['Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36',
  27.                    'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16',
  28.                    'Mozilla/5.0 (Linux; U; Android 4.1.2; zh-tw; GT-I9300 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
  29.                    'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10'
  30.                    'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)']
  31.             hes = {"User-Agent":random.choice(hs)}
  32.       return hes

  33. # ¶°¥xÃҩҿĸê¿Ä¨é¾lÃB¥þ³¡¸ê®Æ
  34. def read_network_data(date,from_number):
  35.       url = 'http://www.twse.com.tw/ch/trading/exchange/MI_MARGN/MI_MARGN.php'
  36.       head =head_random()
  37.       payload = {"download":'',
  38.                  "qdate":date,
  39.                  "selectType":"ALL"}
  40.       res = requests.post(url, headers=head, data=payload)
  41.       soup=BeautifulSoup(res.text, "lxml")
  42.       tab = soup.select('tbody')[from_number] # 2­Óªí®æ¤§2
  43.       regs=[] # ªì©l°}¦C
  44.    
  45.       for i in range(len(tab.select('tr')[0].select('td'))): # ©w¸q2ºû°}¦Cºû«×
  46.             regs.append([])

  47.       for tr in tab.select('tr'): #Â^¨úªí®æ¸ê®Æ
  48.             for i in range(len(tab.select('tr')[0].select('td'))):
  49.                   regs[i].append(tr.select('td')[i].text)
  50.       return regs

  51. def conn_db():
  52.       Conn = win32com.client.Dispatch("ADODB.Connection")
  53.       strMDB ='Provider=Microsoft.ACE.OLEDB.12.0; Data Source=' + os.getcwd() + '\\twsedata.mdb;'
  54.       Conn.ConnectionString = strMDB
  55.       Conn.Open()
  56.       return Conn

  57. def check_db_exists(regs):
  58.       if not os.path.exists('twsedata.mdb'):
  59.             pypyodbc.win_create_mdb( os.getcwd() + '\\twsedata.mdb')
  60.             Conn=conn_db()
  61.             sql = "CREATE TABLE ªÑ²¼(ªÑ²¼¥N¸¹  char(10) PRIMARY KEY,ªÑ²¼¦WºÙ  char(20));"
  62.             Conn.Execute(sql)
  63.             sql = "CREATE TABLE  ¿Ä¸ê¿Ä¨é«H¥Î¥æ©ö²Î­p(¤é´Á  datetime,¶µ¥Ø  char(20),¶R¶i INTEGER,¶R¥X INTEGER,²{ª÷¡]¨é¡^ÀvÁÙ INTEGER,«e¤é¾lÃB INTEGER,¤µ¤é¾lÃB INTEGER);"
  64.             Conn.Execute(sql)
  65.       n = 0
  66.       Conn=conn_db()
  67.       for i in regs[0]:
  68.             try:
  69.                   Conn.Execute('select * from ' + i); # table does not exist
  70.             except Exception as e:
  71.                   sql="CREATE TABLE " + i + "(¤é´Á  datetime,"
  72.                   sql= sql + "¸ê¶R¶i  INTEGER,"
  73.                   sql= sql + "¸ê½æ¥X INTEGER,"
  74.                   sql= sql + "¸ê²{ª÷ÀvÁÙ INTEGER,"
  75.                   sql= sql + "¸ê«e¤é¾lÃB INTEGER,"
  76.                   sql= sql + "¸ê¤µ¤é¾lÃB INTEGER,"
  77.                   sql= sql + "¸ê­­ÃB INTEGER,"
  78.                   sql= sql + "¨é¶R¶i  INTEGER,"
  79.                   sql= sql + "¨é½æ¥X INTEGER,"
  80.                   sql= sql + "¨é²{ª÷ÀvÁÙ INTEGER,"
  81.                   sql= sql + "¨é«e¤é¾lÃB INTEGER,"
  82.                   sql= sql + "¨é¤µ¤é¾lÃB INTEGER,"
  83.                   sql= sql + "¨é­­ÃB INTEGER,"
  84.                   sql= sql + "¸ê¨é¤¬©è INTEGER,"
  85.                   sql= sql + "µù°O char(5));"
  86.                   Conn.Execute(sql)
  87.                   rs = win32com.client.Dispatch('ADODB.RecordSet')
  88.                   rs.ActiveConnection = Conn
  89.                   rs.Open('select * from ªÑ²¼', Conn, 3, 3)
  90.                   rs.AddNew()
  91.                   rs.Fields.Item(0).Value = regs[0][n]
  92.                   rs.Fields.Item(1).Value = regs[1][n]
  93.                   rs.Update()
  94.             n += 1

  95. def add_data(regs,date):
  96.       Conn=conn_db()
  97.       for i in range(len(regs[0])):
  98.             rs = win32com.client.Dispatch('ADODB.RecordSet')
  99.             rs.ActiveConnection = Conn
  100.             sql='select * from ' + regs[0][i]
  101.             rs.Open(sql, Conn, 3, 3)
  102.             for j in range(2,len(regs)):
  103.                   if j==2:
  104.                         rs1 = win32com.client.Dispatch('ADODB.RecordSet')
  105.                         rs1.ActiveConnection = Conn
  106.                         sql="SELECT * FROM " + regs[0][i] + " WHERE ¤é´Á = #" + date + "#;"
  107.                         rs1.Open(sql,Conn,3,3)
  108.                         if rs1.EOF:
  109.                               rs.AddNew()
  110.                               rs.Fields.Item(0).Value = date
  111.                               rs.Fields.Item(j-1).Value = regs[j][i]
  112.                               rs1.Close()
  113.                         else:
  114.                               rs1.Close()
  115.                               break
  116.                   rs.Fields.Item(j-1).Value = regs[j][i]
  117.             rs.Update()

  118. # ¥H¤U¬°µ{¦¡ªº±Ò©lÂI¡G
  119. StartDate=input('½Ð¿é¤J¶}©lÂ^¨ú¤é´Á(¦è¤¸¤é´Á¦p¡G2016/1/1)¡G')
  120. EndDate=input('½Ð¿é¤Jµ²§ôÂ^¨ú¤é´Á(¦è¤¸¤é´Á¦p¡G2016/1/31)¡G')
  121. #³B²z¤é´ÁÁÙ¯uªº«Ü³Â·Ð
  122. ts=time.time()
  123. StartDate = time.strptime(StartDate, "%Y/%m/%d")
  124. EndDate =time.strptime(EndDate, "%Y/%m/%d")
  125. StartDate = datetime.date(StartDate[0], StartDate[1], StartDate[2])
  126. EndDate =  datetime.date(EndDate[0], EndDate[1], EndDate[2])
  127. RangeDate = datetime.timedelta(days = 1)
  128. while StartDate <= EndDate:
  129.       yy,mm,dd=str(StartDate).split('-')
  130.       dat=datetime.datetime(int(yy), int(mm), int(dd))
  131.       dd=dat.strftime('%Y/%m/%d')
  132.       year=str(int(dd[0:4])-1911)
  133.       date=dd.replace(dd[0:4], year)
  134.       print('¥Ø«e°õ¦æºô¸ôÂ^¨ú',date ,'¤éªº¸ê®Æ¡A½Ðµy«á...')
  135.       re=read_network_data(date,1)
  136.       if re[0][0]=='¬dµL¸ê®Æ':
  137.             print(date,'¤é¡A¥i¯à¬°¥ð¥«¤é¡A¬dµL¸ê®Æ¡C')
  138.             StartDate = StartDate + RangeDate
  139.             continue
  140.       print('Àˬd¬O§_¦³·sªÑ²¼¥[¤J¡A½Ðµy«á...')
  141.       check_db_exists(regs=re)
  142.       print('±N¸ê®Æ¼g¤J¸ê®Æ®w¤¤¡A½Ðµy«á...')
  143.       add_data(regs=re,date=dd)
  144.       StartDate = StartDate + RangeDate
  145.       te = time.time()
  146.       print('ºI¦Ü¥Ø«e¡A®É¶¡¤w¯Ó¶O¡G', int(te - ts),'¬í')

  147. print('°õ¦æ§¹²¦¡I')
½Æ»s¥N½X

¦^´_ 1# lpk187
¤Ó´Î¤F¡I
¥ý¨Ó¸Õ¸Õ¬Ý¡AÁÂÁÂÅo¡I

TOP

¦^´_ 1# lpk187
½Ð°Ý pypyodbc ¦p¦ó¤U¦A¦w¸Ë¡H
§Ú¦w¸Ë¤F Anaconda ¤ºªþªº pyodbc µ²ªGÁÙ¬O¤@¼Ë¡C
A0B.png
2016-9-22 21:13

TOP

¥»©«³Ì«á¥Ñ lpk187 ©ó 2016-9-22 22:04 ½s¿è

¦^´_ 3# c_c_lai


    pypyodbc ©Mpyodbc¬O¤£¦Pªº¡A­n¤U¸üpypyodbc ÁÙ¬O­n¦bCMD ¤¤¤U¸ü
pip install pypyodbc


a.png
2016-9-22 21:59


pypyodbc ¨ä¥Îªk§Ú¤]¤£·|¡A¤£¹L·í®É¥u¬Ý¨ì¤@¥y«ü¥O´N¥i¥H²£¥Í¸ê®Æ®w¡A©Ò¥H§Ú´N¤U¸ü¤F
¨ä»yªk¬°    pypyodbc.win_create_mdb( os.getcwd() + '\\twsedata.mdb')

TOP

¥H¤U¬O§Ú°õ¦æªº¹Lµ{¡G
a1.png
2016-9-22 22:33


a2.png
2016-9-22 22:33


a3.png
2016-9-22 22:33


a4.png
2016-9-22 22:33

TOP

¥»©«³Ì«á¥Ñ koshi0413 ©ó 2016-9-23 00:00 ½s¿è

¼F®`¡A¤p§Ì¾Ç²ß¥ý¡A¦³°ÝÃD¦bµo°Ý~

¹ï¤F¡A¥ý´£°Ý¤@¤U  acc ªº¸ê®Æ¬d¸ß³t«×  ¸ò  sqlite3 ¤ñ¸û¤@¤U¡A¦óªÌ§Ö©O¡H

¤p§Ì¬Oµ{¦¡·s¤â¡A©Ò¥H¤°»ò³£¤£À´¡A·|¶Ãµo°Ý¡A½Ð¨£½Ì¼K~~

TOP

¦^´_ 6# koshi0413


    ¬d¸ß³t«×¡AÀ³¸Ó©M¸ê®Æ®w¥»¨­¦³«Ü¤jªºÃö«Y¡IAccess¥»¨­¡A´N¥u¬O­Ó¤H¹q¸£©Ò¨Ï¥Îªº¤p¤p¸ê®Æ®w¡A
·íµM­n³B²z¹³ªÑ¥«¸ê°Tªº¸Ü¡A§Ú¤£·|±ÀÂË¥ÎAccess ¡AÁöµM·L³n¸¹ºÙ¥i¹F·¥­­¬°2G¡AÁöµM§Ú¨S¸Õ¹L¹F¨ì2G·¥­­­Èªº³t«×¡A
¤£¹L¨Ì§Ú·Q¤j·§ºâ¥¦10%¦n¤F¡A¨ä³t«×¤j¬ù´N·|¦³©úÅ㪺®t²§¤F¡C
ÁÙ¦³¦U¤è¼Ò¶ô¡A³£¦³¨äÀu¶Õ¡A·í§Ú¥¿¦b¾Ç²ßpython®É¡A¦³¬Y­Ó¼Ò¶ôªº¬Y¨ç¼Æ¤ñ¥t¥~¼Ò¶ôªº¨ç¼Æ±j®É¡A§Ú·|¥Î³o­Ó¼Ò¶ô¡A
·íµM¡A³o¥u¬O«ü§Ú¥Ø«e¥¿¦b¾Ç²ß¶¥¬qªº·Qªk¡A(¦]¬°ÁÙ¤£¬O«ÜÁA¸Ñ¨ä¨ç¼Æ¥Îªk)

TOP

¦^´_ 4# lpk187
Thanks a lot!
A0B.png
2016-9-23 07:59

TOP

¦^´_ 1# lpk187
«z¡A³Ìªñ¤]·Q¬ã¨s¤@¤U¸ê®Æ®w¡A­è¦nL¤j´Nµo¤F³o½g¡A3Q~

TOP

¦^´_ 5# lpk187
¬Q¤Ñ´ú¤F¤@¤U¡A ±q 2016/1/1 ~ 2016/9/22¡A
µ²ªGµo²{¨Cµ§¸ê®Æ¥u¼g¤J¨ì 2016/8/29¡C
³o¬O¥¿½T¶Ü¡H
A0B.png
2016-9-24 10:29

A0D.png
2016-9-24 10:29

³o¹ê¦b¬O«Ü´Îªº¹ê¥Î½d¨Ò¡A¦A¦¸ÁÂÁ§Aªº¤À¨É¡I

TOP

        ÀR«ä¦Û¦b : ¥@¤W¦³¨â¥ó¨Æ¤£¯àµ¥¡G¤@¡B§µ¶¶ ¤G¡B¦æµ½¡C
ªð¦^¦Cªí ¤W¤@¥DÃD