Board logo

標題: 上櫃 個股日成交資訊 抓取問題 [打印本頁]

作者: espionage    時間: 2015-9-29 11:00     標題: 上櫃 個股日成交資訊 抓取問題

Hi 各位大大中秋快樂
最近我利用假日想抓取 上櫃 個股日成交資訊,部分程式碼如下,執行之後,有時候會停在圖面紅框的地方,顯示無資料,但有的時候又可以跑出成交訊息
而這個地方的程式碼,我找不到搜尋的按鈕,所以copy GKEBB大大之前有一段的語法    A.Focus   Application.SendKeys "~"
想請問各位先進,這一段我應該怎麼改進會比較好?

[attach]22111[/attach]

'------------------------------------------- 【上櫃公司】------------------------------------------------------
'------------------------- 尋找清單中有多少日期(月) 需要展收尋
Set monthrange = Sheets("清單").Range("D65536").End(xlUp) '表示尋找 A 欄的 stock 的最後一列
For searchmonthrange = 2 To monthrange.Row 'Stock 的執行範圍,從第 2 行開始執行,到最後一行
myyearwest = Sheets("清單").Cells(searchmonthrange, 3) '股價西元年
myyeareast = Sheets("清單").Cells(searchmonthrange, 3) - 1911 '股價民國年
mymonth = Sheets("清單").Cells(searchmonthrange, 4) '股價月
yearmonth = myyeareast & "/" & mymonth
'------------------------- 打開股票網頁
With CreateObject("InternetExplorer.Application") '開啟證券櫃臺買賣中心網頁
  .Visible = True
  .Navigate "http://www.tpex.org.tw/web/stock/aftertrading/daily_trading_info/st43.php?l=zh-tw"
   Do While .Busy Or .readyState <> 4: DoEvents: Loop
With .document
'--------------------輸入要查詢的日期
   For Each A In .getelementsbytagname("INPUT") '找原始碼有input參數
   If A.Name = "input_date" Then A.Value = yearmonth
   Next

  '--------------------輸入要查詢的股票代碼
   For Each A In .getelementsbytagname("INPUT") '找原始碼有input參數
   If A.Name = "input_stock_code" Then A.Value = stockcode
   Next

  '--------------------輸入要查詢的股票代碼
   For Each A In .getelementsbytagname("INPUT") '找原始碼有input參數
   If A.ID = "input_stock_code" Then
   A.Focus
   Application.SendKeys "~"
   End If
   Next

End With
Application.Wait Now + #12:00:05 AM# '等待網頁下載資料
作者: GBKEE    時間: 2015-9-29 14:47

回復 1# espionage
試試看
  1. With CreateObject("InternetExplorer.Application") '開啟證券櫃臺買賣中心網頁
  2.         .Visible = True
  3.         .Navigate "http://www.tpex.org.tw/web/stock/aftertrading/daily_trading_info/st43.php?l=zh-tw"
  4.         Do While .Busy Or .ReadyState <> 4: DoEvents: Loop
  5.         With .document
  6.             .getElementsByTAGName("INPUT")("input_stock_code").Value = stockcode
  7.             '--------------------輸入要查詢的日期
  8.             With .getElementsByTAGName("INPUT")("input_date")
  9.                 .Value = yearmonth
  10.                 '*********************
  11.                 .fireEvent ("onchange") 'ie8可用
  12.                 '新版ie 請參考 http://forum.twbts.com/thread-14308-1-1.html
  13.                 '**********************
  14.             End With
  15.         End With
  16.     End With
複製代碼

作者: espionage    時間: 2015-9-29 21:49

Hi GBKEE 大大
謝謝你,我目前在IE8的網頁可以操作,不過我想請教一個問題,為什麼使用fireEvent ("onchange")之後,最後一段VBA,我用'Do While .Busy Or .readyState <> 4: DoEvents: Loop,這個語法,有時候網頁會無顯示資料,而要改用Application.Wait Now + #12:00:03 AM#,才比較穩呢,每次都有資料? 是不是要讓網頁等待

=============以下為VBA===================
'------------------------- 打開股票網頁
With CreateObject("InternetExplorer.Application") '開啟證券櫃臺買賣中心網頁
  .Visible = True
  .Navigate "http://www.tpex.org.tw/web/stock/aftertrading/daily_trading_info/st43.php?l=zh-tw"
   Do While .Busy Or .readyState <> 4: DoEvents: Loop

With .document

  '--------------------輸入要查詢的股票代碼
   For Each A In .getelementsbytagname("INPUT") '找原始碼有input參數
   If A.Name = "input_stock_code" Then A.Value = stockcode
   Next

  '--------------------輸入要查詢的日期
   For Each A In .getelementsbytagname("INPUT") '找原始碼有input參數
   If A.Name = "input_date" Then
   A.Value = yearmonth
   A.fireEvent ("onchange")
   End If
   Next

End With
Application.Wait Now + #12:00:03 AM# '等待網頁下載資料
'Do While .Busy Or .readyState <> 4: DoEvents: Loop

作者: GBKEE    時間: 2015-9-30 17:13

回復 3# espionage
不錯是要等待網頁的資料下載完畢
  1. Option Explicit
  2. Sub Ex()
  3.     Dim a As Object, stockcode
  4.     With CreateObject("InternetExplorer.Application") '開啟證券櫃臺買賣中心網頁
  5.         .Visible = True
  6.         stockcode = 4111
  7.         .Navigate "http://www.tpex.org.tw/web/stock/aftertrading/daily_trading_info/st43.php?l=zh-tw"
  8.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  9.         With .Document
  10.             .getElementsByTAGName("INPUT")("input_stock_code").Value = stockcode
  11.             '--------------------輸入要查詢的日期
  12.             With .getElementsByTAGName("INPUT")("input_date")
  13.                 .Value = "104/06" ' yearmonth
  14.                 '*********************
  15.                 .fireEvent ("onchange") 'ie8可用
  16.                 '新版ie 請參考 http://forum.twbts.com/thread-14308-1-1.html
  17.                 '**********************
  18.             End With
  19.             With .getElementByID("stk_no")
  20.                 Do
  21.                     If .INNERTEXT = "請輸入股票代碼及資料年月" Then
  22.                         MsgBox "請輸入股票代碼及資料年月"
  23.                         GoTo ER
  24.                     End If
  25.                 Loop Until InStr(.INNERTEXT, stockcode)
  26.             End With
  27.             Set a = .getElementsByTAGName("table")
  28.             MsgBox .getElementByID("stk_no").INNERTEXT & vbLf & a(0).outertext
  29.         End With
  30. ER:
  31.         .Quit
  32.     End With
  33. End Sub
複製代碼





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)