ªð¦^¦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

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

TOP

½Ð°Ý¦U¦ì¤j¤j¡A³Ìªñ¤£·Q±qÃÒ¥æ©Ò§ì¸ê®Æ¡A§ï¦V¹d¦ëºô¡A¤£¹L¦bºô­¶¸ÑªR¤W¨S¸gÅç(¤§«e¬O½Ð±Ð§O¤H«á¡A¦A¨Ì¼Ë¹º¸¬ÄªºCºC§ï¥X¦Û¤w·Q­nªº)
­ìµ{¦¡³¡¥÷Àɦpªþ¥ó¡A

  ­Y§ï¥Ñ¹d¦ëºô¤U¸ü¸ê®Æªº¸Ü¡A±qºô¸ô¤W¬Ý¤å³¹¡A¨ä¤¤§ï¦¨¥H¤U¡A¤£¹L¦n¹³¨S¿ìªk°e¥X¬d¸ß¡A·Q½Ð±Ð¬O­þ¸Ì¥X°ÝÃD??
          = "    cnyes.com/twstock/ps_historyprice/" + (cell21)+".htm"
    classSelectTextStart = (str(yy-1)+"/"+str(mm)+"/"+str(dd))
    classSelectTextEND = (str(yy)+"/"+str(mm)+"/"+str(dd))
  
    browser.find_element_by_id("ctl00_ContentPlaceHolder1_startText").send_keys(classSelectTextStart)
    browser .find_element_by_id("ctl00_ContentPlaceHolder1_endText").send_keys(classSelectTextEND)
    browser.find_element_by_id("ctl00_ContentPlaceHolder1_submitBut").send_keys(Keys.ENTER)
    time.sleep(10)

­ì©lÀÉ.tar (4.5 KB)

TOP

¤Ó´Î¤F!  ÁÂÁ¤j¤jªº¤À¨É~~

TOP

¦^´_ 52# lpk187
§Úªº¬O 179 Records¡C

TOP

¥Ñ©ó sqlite3 ¦b¤é´Á®É¶¡ ¬O¥H¤å¦r¦ê¦s¤J¡A¦Ó«D¥H¤é´Á®É¶¡®æ¦¡¦s¤J(¦p¡G#2016/01/06#)
¦Ósqlite3ªºdate¨ç¼Æªº¤é´Á®æ¦¡¥²¶·¹³'2016-01-06'¦~¤ë¤é»Ý¥H'-'¹j¶} ¡A­Y¥H'2016/01/06' ±×½u '/'¹j¶}¡A¥HSQL»yªk·|µLªk­pºâ
©Ò¥H¦b¦s¤Jsqlite3¸ê®Æ®wªº¤é´Á¡A¥²¶·¥ý³B²z

¦b dd=dat.strftime('%Y/%m/%d')ªº¤U¦æ»Ý¥[¤J¥t¤@¥y
sqldate=dat.strftime('%Y-%m-%d')

¦Ó³o¥yadd_data(regs=re,date=dd)¥²¶·­×§ï¬°
add_data(regs=re,date=sqldate)

¦b¥H«áªº¤é´Á³B²z¡A´N·|®e©ö³B²z¤F

sqlite3¦b¤é´Á¬d¸ß¤è­±¡A¨Ò¦p»¡­n¬d¸ß '2016-01-01' ¨ì '2016-01-31'
¦bSQL»yªk¤è­± ­ì¨Óªº¥Îªk WHERE ¤é´Á BETWEEN '2016-01-01' AND '2016-01-31'
¦Ósqlite3 «o¤£¯à¥H BETWEEN ¥h³B²z¡A´N¹³«e­±»¡ªº¡A¤é´Á®É¶¡ ¬O¥H¤å¦r¦ê¦s¤J¡A¤å¦r¦ê¤£¯à¥Î¦b¤é´Á®É¶¡³B²z

©Ò¥Hsqlite3ªºSQL»yªk¬°
"select * from [0050] where julianday(¤é´Á)>=julianday('2016-01-01') and julianday(¤é´Á)<=julianday('2016-01-31')"

TOP

¦^´_ 49# c_c_lai


   §A°õ¦æªº±¡ªp¡A¯uªº«Ü©_©Ç¡I§Ú°õ¦æ¤F3¦¸±q2016/1/1¨ì2016/9/29 ¤]³£¨S¦³±o¨ì¹³§A¤@¼Ëªºµ²ªG
§A¦A§â¸ê®Æ®w§R±¼¡AÆ[¹î²Ä¤@¦¸¬O¤£¬O·|¤£§¹¾ã¡A±q2016/1/1¨ì2016/9/29¦@¦³170µ§¸ê®Æ¡A¬Ý¬O¤£¬O·|¤£°÷
§Úµ{¦¡¸Ì­±¡A¥u¦³´¡¤JINSERT INTO...¨Ã¨S¦³­×§ïªº»y¥y¦Ó¥B·í¦³­«ÂЭȮɡA¨Ã¤£·|°õ¦æ¥ô¦ó°Ê§@
except Exception as e:
            pass
¦A³Â·Ð§A¤F

TOP

¨ä¹ê§A´£¨ìªº ¡G
"¥Ø«eªº·Qªk¬O   python §ì¨ú¸ê®Æ¦Ü sqlite3¡Avba ±q sqlite3 ¨ú¥X¸ê®Æ"
¦b¹ê°È¤W³oºØ ...
c_c_lai µoªí©ó 2016-9-30 15:22


­ì¨Ó¦p¦¹¡A¤p§Ì¬O¬Ýªø´Á¤ë½uªº¡A©Ò¥H¬O­n²Î­p¾ú¥v¸ê®Æ¨S¦³¿ù
½u¤W§Y®É§@·~ ¤p§Ì¨S¿ëªk¡A­ì¨Ó¬O¾Þ§@¤âªkªº¤£¦P

¬G¡Aªd¥Îpython¨ú¥Xsql¤ºªºªí®æ¡A¥u¬O³æ¯Â­nµe¹Ï¡H
¦L¹³¤¤   ¥xÆWªº ½u¤W§Y®É§@·~ ³£¬O¥Î excel ¡]°ê¥~Å¥»¡§ï±¼¤F¡^
¥Îvba¤~¥i¥H§Y®É¤¬°Ê   pythonÀ³¸ÓÁÙ¤£¦æ~~¤£¹L¤]¤£¤@©w¡A»¡¤£©w¦hgoogle  ´N¦³°ª¤â§@¥X¨Ó¤F©O

ps:«y«y~~¤j®a¤W¯Z¤£¤W¯Zªº¦b²á³o­Ó¡A«¢«¢«¢

TOP

c¤j
¥i§_½Ð±Ð¤@¤U¡A¦bpython¨ú¥X¸ê®Æsql  ¬O­n¦b pythonª½±µµe¹Ï¹À¡H³t«×¸û§Ö¡HÁÙ¬O³æ¯Â½m²ß©O¡H
¦]¬°¬Ý ...
koshi0413 µoªí©ó 2016-9-30 14:43

¨ä¹ê§A´£¨ìªº ¡G
"¥Ø«eªº·Qªk¬O   python §ì¨ú¸ê®Æ¦Ü sqlite3¡Avba ±q sqlite3 ¨ú¥X¸ê®Æ"
¦b¹ê°È¤W³oºØ¤è¦¡¡A¥u¯à·í§@¬O ¡yÀx³Æ§@·~¡z¡A´£¨Ñ§@¬° ¡u¾ú¥v¸ê®Æ¬d¸ß¡v¡F
¡y½u¤W§Y®É§@·~¡z¬O Excel ª½±µ»P¨é°Ó DDE ³sµ²Ą̊ú¸ê°T¡Aª½±µ¶i¦æø¹Ï¤ÀªR¡F
°£«D Python ¤]´£¨ÑÃþ¦ü¦p¦¹¤§¥\¯à (³sµ²¨é°ÓDDE)¡F±µ¤U¨Ó³z¹L
Candlestick OHLC graphs with Matplotlib ¨Ó³B²z¡C

TOP

¦^´_ 44# lpk187
¸g¤ñ¹ï«á©lµo²{¤£µL­«½ÆÁä­È¡F¦Ó¬O²Ä¤@¦¸°õ¦æ®É
³¡¦ì¨Ì¦¸§¹¥þ¼g¤J¡A¦A²Ä¤G¦¸°õ¦æ®Éµo²{±q Rec#104«á
¤S¦³·sªº¬ö¿ý¼g¤J¡A¤~ı±o³Y²§¡C
¸g¤j¤j¦A¦¸¤ÀªR¸Ñ»¡¡A¦A¦¸¸ê®Æ¤ñ¹ï¤~µo²{¨ä¬°·s­È¡C

²{¦bªº°ÝÃD¬O¡G ²Ä¤@¦¸ªì©l¸ê®Æ¼g¤J®É¹H©M·|¬O¤£§¹¾ã¡H

TOP

        ÀR«ä¦Û¦b : °µ¦n¨Æ¤£¯à¤Ö§Ú¤@¤H¡A°µÃa¨Æ¤£¯à¦h§Ú¤@¤H¡C
ªð¦^¦Cªí ¤W¤@¥DÃD