peter624 wrote:
發生物件不支援屬性和方法(恕刪)
Jsondata.write "中間的程式碼,沒複製到"
程式碼,被論譠消失了,請重新複製修改,或找其它有附檔案的範例複製
peter624 wrote:
另請問大大,Url是從檢視工具觀察到的嗎(chrome按F12)
Url = "https://www.tpex.org.tw/web/stock/statistics/monthly/monthly_rpt_mkt_info_result.php?l=zh-tw&t=5&sd=" & sd & "&ed=" & ed & "&_="(恕刪)
是的
一、先開網站
二、F12
三、隨便查詢一次

不一定要chrome,只要是瀏覽器都可以,您想用ie也行

或是使用網路上大家愛用的第三方工具,例如"fiddler",追踨網站
(fiddler相關教學很多,請自行google)
我個人是比較喜歡用內建的功能處理,不用另外裝軟體,比較方便
alantsai5840 wrote:
306樓的 Wantgoo.xlsm(old1 ; new1) 檔 最近執行 又分別出現
執行階段錯誤-2147417848(80010108) Automation錯誤
沒有設定物件變數或 with 區塊變數
看程式又沒問題
不知網站是改變問題 ?
... (恕刪)
因為網站加上了ddos防護,標準的xmlhttp寫法會被擋下來抓不到資料

從這次wantgoo網改版後的廣告、加入ddos防護來看
wnatgoo比較希望大家付費拿整理好後的資料
所以基於尊重wantgoo網,這次希望大家付費的改版

xmlhttp vba算式、程式碼,保留不公開,只簡單說一下流程
如果不介意速度,請改用 ie object方式
'下載需要2個cookies,1個token,3個參數,1個jschl_answer
'但是jschl_answer,需要改用vba計算
'一、先進網站取得r, jschl_vc, pass,cookies
'二、用regexp把網頁原始碼中的java算式拆出來
'三、用vba+eval算出jschl_answer
'四、等5秒(其實網頁原始碼中是4秒)
'五、用取得的參數、網址開始下載
'之後只要程式不結束,速度都跟原本沒保護時一樣快
'java公式是什麼呢?看到圖片中那些!+[]+!![]+!![]+!![]+!![]+!![],那些就是算式
'(像這個(!+[]+!![]+!![]+!![]+!![]+!![])算出來是=6)
'但是原始碼中的變數、算式,是隨機的,所以要用regexp拆解
'最後要算出 a.value = (+BtZfvqK.bTtid + t.length)
'BtZfvqK是隨機變數,其中t.length就是網址長度,可以定值代替
url_a = "https://www.wantgoo.com/stock/astock/agentstat?stockno=" & stock & "&type=3.5"
Set Xmlhttp = CreateObject("Msxml2.XMLHTTP")
With Xmlhttp
.Open "GET", url_a, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send
HtmlSourceCode.body.innerhtml = .responseText
Dim PostData, url_c As String, r As String, jschl_vc As String, pass As String, jschl_answer As String
Dim decode_jschl_answer As Object, Get_formula As Object
Set Get_formula = CreateObject("VBScript.RegExp")
Set decode_jschl_answer = CreateObject("HtmlFile")
decode_jschl_answer.write "<script>document.jschl=function (s) {return eval(很長的算式保留)</script>"
PostData = HtmlSourceCode.getelementbyid("challenge-form")
url_c = "https://www.wantgoo.com" & PostData.form.Action
r = PostData.form.Item(0).Value
jschl_vc = PostData.form.Item(1).Value
pass = PostData.form.Item(2).Value
With Get_formula
.Pattern 保留
程式碼保留
End With
jschl_answer=很長的算式保留
程式碼保留
.send "r=" & r & "&jschl_vc=" & jschl_vc & "&pass=" & pass & "&jschl_answer=" & jschl_answer
程式碼保留
使用ie object 慢速抓資料的範例:

Sub test()
Dim Ie As Object, Url As String, stock As String, table, i As Integer, j As Integer
ActiveSheet.Cells.Clear
Application.ScreenUpdating = False
Set Ie = CreateObject("InternetExplorer.Application")
Url = "https://www.wantgoo.com/"
stock = InputBox("股票代號", , "2317")
If stock = "" Then Exit Sub
With Ie
.Visible = True
.Navigate Url
Do While .Busy Or .ReadyState <> 4: DoEvents: Loop
Application.Wait (Now + TimeValue("0:00:10")) '等待ddos防護時間,需大於5秒
'for........ 如果需要多筆查詢,請從這裡加上迴圈,只需改變stock參數
.Navigate "https://www.wantgoo.com/stock/astock/agentstat?stockno=" & stock & "&type=3.5"
Do While .Busy Or .ReadyState <> 4: DoEvents: Loop
.document.all.Item("txtDaysDefine_s").Value = "2019/11/21" '開始日期
.document.all.Item("txtDaysDefine_e").Value = "2019/12/12" '結束日期
.document.all.Item("btnDaysDefine").Click
Application.Wait (Now + TimeValue("0:00:8")) '等待查詢結果,視電腦效能、網路狀態,修改適合時間
Set table = .document.getelementsbytagname("table")(0).Rows
For i = 0 To table.Length - 1
For j = 0 To table(i).Cells.Length - 1
ActiveSheet.Cells(i + 1, j + 1) = table(i).Cells(j).innertext
Next j
Next i
'這𥚃分成2個表格,方便閱讀,可自行用迴圈合併成一個
Set table = .document.getelementsbytagname("table")(1).Rows
For i = 0 To table.Length - 1
For j = 0 To table(i).Cells.Length - 1
ActiveSheet.Cells(i + 1, j + 1 + 5) = table(i).Cells(j).innertext
Next j
Next i
ActiveSheet.Cells.Columns.AutoFit
'next ........ 多筆查詢迴圈結束
End With
Ie.Quit
Set Ie = Nothing
Set table = Nothing
Application.ScreenUpdating = True
End Sub
如果真想快速下載ddos保護的網站,請改用 python
python有繞過 cloudflare ddos保護的外掛套件
或另找資料來源網站,再用excel計算、整理成wnatgoo的資料格式
(別問我去那裡找、怎麼整理,本人沒有任何股市分析、計算的知識
)ie object 慢速下載範例(這次 xmlhttp vba 快速下載範例保留不公開)
[點擊下載]




























































































