Board logo

標題: [發問] 有大大能找到鉅亨網的隱藏網址嗎?以及網頁元素問題 [打印本頁]

作者: PKKO    時間: 2016-10-7 15:27     標題: 有大大能找到鉅亨網的隱藏網址嗎?以及網頁元素問題

本帖最後由 PKKO 於 2016-10-7 15:29 編輯

http://www.cnyes.com/twstock/ps_historyprice/3514.htm
網址裡面有一個開始跟結束日期
請大大們教導如何找出隱藏的網址,可以直接從網址當中控制起迄日期
這樣就可以直接用錄製巨集的方式下載(感覺這種方式比較穩定)

我目前使用網頁元素可以控制起迄日期,但碰到一個問題是
當提出查詢按鈕的時候,無法得知網頁何時跑完
導致網頁還沒跑完,程式碼已經繼續往下執行了
這樣會導致資料是(案下查詢按鈕之前的資料)
  1. Sub testDL()   '下載股票資訊
  2. Set ie = CreateObject("InternetExplorer.Application")
  3. ie.Visible = True
  4. ie.Navigate "http://www.cnyes.com/twstock/ps_historyprice/" & "3514" & ".htm"
  5. Do While ie.readyState <> 4: DoEvents: Loop
  6. st_date = "2016/01/01"
  7. With ie.Document
  8.     '開始日期
  9.     For Each E In .GetElementsByTagName("INPUT")
  10.         If E.ID = "ctl00_ContentPlaceHolder1_startText" Then
  11.             E.Value = st_date: Exit For
  12.         End If
  13.     Next
  14.     '查詢按鈕
  15.     Do While ie.readyState <> 4 Or ie.Busy: DoEvents: Loop
  16.     For Each E In .GetElementsByTagName("INPUT")
  17.         If E.ID = "ctl00_ContentPlaceHolder1_submitBut" Then
  18.             E.Click: Exit For
  19.         End If
  20.     Next
  21.     '=================================下載資料=================================
  22.     Do While ie.readyState <> 4 Or ie.Busy: DoEvents: Loop'這行程式碼無效,無法真的等待網頁執行時間
  23.     MsgBox "網頁實際上還沒完成!導致下載的資料是舊的"
  24. End With
  25. ie.Quit
  26. End Sub
複製代碼

作者: joey0415    時間: 2016-10-7 17:51

http://www.cnyes.com/twstock/ps_historyprice/3514.htm
網址裡面有一個開始跟結束日期
請大大們教導如何 ...
PKKO 發表於 2016-10-7 15:27


真的要股價資料要從證交所與OTC下載放進資料庫中,直接查你要的股票與日期,快又不用等待,每天下載一次,自己本地端查快要有效率,完全不用考慮網頁資料的問題
作者: PKKO    時間: 2016-10-7 19:27

本帖最後由 PKKO 於 2016-10-7 19:28 編輯

回復 2# joey0415


不曉得大大說的是以下兩個網站嗎?證交所與櫃買中心
因為我需要的是一次下載n個月的資料
我有寫過自動下載,但不堪其擾...

一、必須要區分上櫃與上市
二、資料都是以月為單位,速度更慢
三、無法直接透過網址來截取資料,因為有些特別年月會第一次無法讀取,第二次執行才可以讀取
四、相同也是以網頁元素來取得資料,但遊戲規則還會時常變更

http://www.tpex.org.tw/web/stock/aftertrading/daily_trading_info/st43.php?l=zh-tw
http://www.twse.com.tw/ch/trading/exchange/STOCK_DAY_AVG/STOCK_DAY_AVGMAIN.php
作者: PKKO    時間: 2016-10-7 20:03

回復 2# joey0415


    目前網路下載最快的是YAHOO的資料,但YAHOO的資料一堆錯誤的
只有找到鉅亨網似乎是不錯的下載網站
作者: joey0415    時間: 2016-10-7 21:17

回復 3# PKKO

這兩個網站沒錯,不過請你下載每天的盤後交易檔,不是月檔

一年250天,五年才1250次

上市加上櫃 共2500次,你會爬下來,一秒一次,一小時就全部抓下來了

這兩個網站才有正確的資料,其它網站都會有停機與資料不正確的問題

鉅亨你爬1000次看看,你就知道資料下載會有問題,網頁的快慢不是靠爬蟲就能解決

這兩個網站不會檔爬蟲
作者: ketrddem    時間: 2016-10-8 01:55

本帖最後由 ketrddem 於 2016-10-8 01:57 編輯

不要用網頁元素來抓,直接用匯入就好了[attach]25486[/attach]

開啟後,把你想抓的歷史股價輸入到「清單」的第一欄
然後按「重建歷史股價」
你要的就幫你抓好囉
作者: GBKEE    時間: 2016-10-8 08:15

回復 1# PKKO

試試看
  1. Option Explicit
  2. Sub testDL()   '下載股票資訊
  3.     Dim IE As Object, st_date As String, xTable As Object, R As Integer, C As Integer
  4.     st_date = "2016/02/01"
  5.     Set IE = CreateObject("InternetExplorer.Application")
  6.     IE.Visible = True
  7.     IE.Navigate "http://www.cnyes.com/twstock/ps_historyprice/" & "3514" & ".htm"
  8.     Do While IE.readyState <> 4: DoEvents: Loop
  9.     With IE.Document
  10.         R = .ALL.tags("table")(1).Rows.Length ' '**資料數(含表頭): 網頁預設顯示為一個月的資料
  11.         '開始日期
  12.         ' ************* 有ID 可直接用ID的名稱********
  13.         .GetElementByid("ctl00_ContentPlaceHolder1_startText").Value = st_date
  14.         Do While IE.readyState <> 4 Or IE.Busy: DoEvents: Loop
  15.         'For Each E In .GetElementsByTagName("INPUT")
  16.         '    If E.ID = "ctl00_ContentPlaceHolder1_startText" Then
  17.         '        E.Value = st_date: Exit For
  18.         '    End If
  19.         'Next
  20.         '查詢按鈕
  21.         .GetElementByid("ctl00_ContentPlaceHolder1_submitBut").Click
  22.         'For Each E In .GetElementsByTagName("INPUT")
  23.         '    If E.ID = "ctl00_ContentPlaceHolder1_submitBut" Then
  24.         '        E.Click: Exit For
  25.         '    End If
  26.         'Next
  27.         '=================================下載資料=================================
  28.         Do While IE.readyState <> 4 Or IE.Busy: DoEvents: Loop    '這行程式碼無效,無法真的等待網頁執行時間

  29.         Do
  30.             DoEvents
  31.             Set xTable = .ALL.tags("table")(1)
  32.             If xTable.Rows.Length <> R And xTable.Rows.Length > 1 Then Exit Do ''** 等候資料日數等於指定的日數
  33.             ' 等後資料下載時: xTable.Rows.Length=1
  34.         Loop
  35.         '=================================下載資料=================================
  36.         With ActiveSheet
  37.             .UsedRange = ""
  38.             For R = 0 To xTable.Rows.Length - 1
  39.                 For C = 0 To xTable.Rows(R).Cells.Length - 1
  40.                     .Cells(R + 1, C + 1) = xTable.Rows(R).Cells(C).innertext
  41.                 Next
  42.             Next
  43.         End With
  44.         MsgBox "資料下載完成!"
  45.     End With
  46.     IE.Quit
  47. End Sub
複製代碼

作者: joey0415    時間: 2016-10-8 12:02

本帖最後由 joey0415 於 2016-10-8 12:04 編輯

回復 6# ketrddem

大大的回答真棒!

請問一下
.PostText = "ctl00$ContentPlaceHolder1$startText=" & 查詢起始日

中加入結束日期ctl00$ContentPlaceHolder1$endText,好像不會跳動

這個方法好向不用再加那一串的__EVENTVALIDATION是嗎?

在WITH中最後加上.DELETE,就可刪除連線
作者: PKKO    時間: 2016-10-8 13:12

回復 6# ketrddem
ketrddem 大大,您好厲害耶,用下載的方式又快又穩,即便錯誤也不會中斷= =好多問題想向大大請教
一、與joey0415大大問題相同,下列程式碼無法運作,當多重條件的時候要如何輸入?
  1. With QT
  2. .PostText = "ctl00$ContentPlaceHolder1$startText=" & "2016/01/01"
  3. .PostText = "ctl00$ContentPlaceHolder1$endText=" & "2016/05/01"
  4. .WebTables = "2"
  5. .Refresh False
  6. .Delete
  7. End With
複製代碼
二、用下載的方式資料一定要先放在EXCEL上面嗎?可否直接輸出到陣列上面?
三、您如何找到該字串的?
[attach]25490[/attach]
為何不是輸入B欄位的ID字串而是輸入C欄位的NAME字串?網頁都是輸入NAME字串嗎?
四、只要是輸入變數都是使用.PostText 這個指令嗎?還是有何變化
五、或許小弟問題太多造成您困導,請問可以在哪邊找到關於下載的詳細相關方法呢?

以上麻煩大大了,再次提出萬分感激
PS:大大根本不是VBA新手,您應該要把簽名檔換掉了><"
作者: PKKO    時間: 2016-10-8 13:20

回復 7# GBKEE
超版大大您好,小弟找不到這段程式碼的資料
  1. Set xTable = .all.tags("table")(1)
複製代碼
從區域變數當中,不曉得這個.all.tags("table")在哪邊= =
[attach]25491[/attach]

小弟太嫩了,還請指教,網頁元素也是跟超版大大學習的
但這個.all.tags("table")以前完全沒看過@@
作者: ketrddem    時間: 2016-10-8 14:38

回復  ketrddem

大大的回答真棒!

請問一下
.PostText = "ctl00$ContentPlaceHolder1$startText="  ...
joey0415 發表於 2016-10-8 12:02


鉅亨,印象中好像是直接抓到最新資料。
但它有一個缺點,設定的起始日,有時抓到的資料根本就不是那一天。
無所謂,反正要的是歷史資料,事後再做運算而已
作者: ketrddem    時間: 2016-10-8 14:48

回復  ketrddem
ketrddem 大大,您好厲害耶,用下載的方式又快又穩,即便錯誤也不會中斷= =好多問題想向大 ...
PKKO 發表於 2016-10-8 13:12



一、與joey0415大大問題相同,下列程式碼無法運作,當多重條件的時候要如何輸入?
多條件時,應該就要在股票代號部份做限定,加if去判斷要不要匯入這個股票的歷史數據。
for i = 股票代號 to lostrow
    if i XXXX  then
        goto ABC
   end if

ABC:
next

那個抓結束日期的,應該是沒有用處的,印象中鉅亨就是直接顯示最新資料


二、用下載的方式資料一定要先放在EXCEL上面嗎?可否直接輸出到陣列上面?
我沒試過能不能輸出到陣列,個人理解是不行,因為沒有賦值。
歷史資料的應用,小弟是全數抓到一個「歷史股價」xlsm。
計算上,就用另一個excel,用SQL抓下來,計算後再刪除。基本上用陣列計算,效率很高。

三、您如何找到該字串的? 為何不是輸入B欄位的ID字串而是輸入C欄位的NAME字串?網頁都是輸入NAME字串嗎?
用IE,開發者工具,找POST的元素就找得到了。但在找之前,要重新整理網頁,讓網頁實際跑一次網頁的變化,這時候就能看到POST在抓什麼元素了。


四、只要是輸入變數都是使用.PostText 這個指令嗎?還是有何變化
這一點,小弟不知耶,我沒玩得這麼精,就單純抓歷史資料這個功能實現了就OK了,後續也沒再深入摸索POST這方法了。


五、或許小弟問題太多造成您困導,請問可以在哪邊找到關於下載的詳細相關方法呢?
很久以前摸索的,現在叫我回想從那裏發現這個方法或資料的,有點難度。忘光光了
作者: GBKEE    時間: 2016-10-8 14:56

回復 10# PKKO


   [attach]25492[/attach]



[attach]25493[/attach]




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