- 帖子
- 2848
- 主題
- 10
- 精華
- 0
- 積分
- 2903
- 點名
- 0
- 作業系統
- 〔略〕
- 軟體版本
- 〔略〕
- 閱讀權限
- 100
- 性別
- 男
- 來自
- 〔略〕
- 註冊時間
- 2013-5-13
- 最後登錄
- 2026-7-25
|
[分享] 使用 XMLHTTP + ADODB.Stream 查詢保戶股權分散表
本帖最後由 准提部林 於 2015-11-9 21:18 編輯
使用 XMLHTTP + ADODB.Stream 查詢保戶股權分散表
<題由>
取得網頁原始碼的資料
http://forum.twbts.com/thread-15528-1-1.html
雖然作了回覆,特再花個時間做個MEMO,
除了為自己做個備忘錄,也希望讓網友多個參考處。
<註一>
無法使用.responseText取得原始碼文字,肇因可能為網頁編碼的關係,
取出的文字為〔亂碼〕,故造成程式的錯誤中斷;
因此借用 ADODB.Stream 為中介,以〔二進位〕方式取出原始碼,
可用〔XMLHTTP ADODB.Stream〕為關鍵字 GOOGLE 一下,
有相當多的資料可參考,個人也是一知半解(知其然)而已,
為免做錯誤的解釋,請自行去探索,
也期待有心的專家來補充益眾。
<註二>
本範例主要網址為:http://www.tdcc.com.tw/smWeb/QryStock.jsp,
XMLHTTP 並未對網頁〔控件〕做查詢參數的輸入操作,
因此,程式碼必須含有〔查詢參數〕,例如:〔日期〕〔股票代碼〕,
經多次嚐試,不得其門而入,拼半天也只是:
SCA_DATE=日期&StockNo=股票代碼∼∼但行不通!!!
後想到超板有答過此相關題,找了一下,在這裡:
http://forum.twbts.com/thread-15067-1-7.html
網址完整後綴如下:
SCA_DATE=日期&SqlMethod=StockNo&StockNo=股票代碼&StockName=&sub=%ACd%B8%DF
這串文字怎來的?期待超板的開示∼∼
<註三>
XMLHTTP〔post.get〕的差異!
get:第一次執行,譬如向客戶要求傳真,須等文件傳送,所以花些時間;
第二次以後的執行,因文件已存在,就直接取用,時間快很多;
但那是〔舊資料〕,可能與最新的正本有差異。
post則每次都要求傳送,以取得最新的資料。
另外可以在網址後面加入亂數,例如:
URL = "http://www.tdcc.com.tw/smWeb/QryStock.jsp" & "?" & Rnd
使每次連結的網址視為不同,也可達到取得最新內容的目的,但並非所有網址可如此。
<註四>
一般若輸入錯誤的網址,應會傳回錯誤,或傳回未就緒訊息,
但有時網頁雖未進入指定的目的頁,但會自動跳至其主頁或首頁,
此時 XMLHTTP 仍然可以正常傳回文字,只是並非所要的內容,
所以還是要注意。
<後記>
對網頁存取仍是門外人,僅如上淺薄注文,間或有誤有漏,請自行參酌;
以下的程式碼及範例也僅供參考套用,恕不為網友個別提供客製修改;
希望路過專家不吝指導,為此帖漏誤之處做更精確的大補帖,謝謝!
=================================
Sub 取出日期清單()
Dim XML, URL$, TT
[A:A].ClearContents
URL = "http://www.tdcc.com.tw/smWeb/QryStock.jsp" & "?" & Rnd
Set XML = CreateObject("Microsoft.XMLHTTP")
XML.Open "post", URL, False
XML.send
If XML.Status = 200 Then
With CreateObject("ADODB.Stream")
.Open
.Type = 1
.Write XML.ResponseBody
.Position = 0
.Type = 2
.Charset = "BIG5"
TT = .ReadText
.Close
End With
TT = Replace(TT, "</option><option >", "_")
TT = Split(TT, "</option>")(0)
TT = Split(TT, "<option >")(1)
TT = Split(TT, "_")
[A1].Resize(UBound(TT) + 1) = Application.Transpose(TT)
End If
Set XML = Nothing
End Sub
=================================
Sub 保戶股權分散表查詢()
Dim XML, URL$, TT, vDate, vNo, vFile$, X, PP$
vDate = [F1]: vNo = [F2]: vFile = vNo & "_" & vDate & ".csv"
URL = "http://www.tdcc.com.tw/smWeb/QryStock.jsp?SCA_DATE=" & vDate & _
"&SqlMethod=StockNo&StockNo=" & vNo & "&StockName=&sub=%ACd%B8%DF"
Set XML = CreateObject("Microsoft.XMLHTTP")
XML.Open "post", URL, False
XML.send
If XML.Status = 200 Then
With CreateObject("ADODB.Stream")
.Open
.Type = 1
.Write XML.ResponseBody
.Position = 0
.Type = 2
.Charset = "BIG5"
TT = .ReadText
.Close
PP = "<table cellspacing=0 cellpadding=0 width=""100%"" border=0>"
X = Split(TT, PP)
If UBound(X) < 3 Then Exit Sub
TT = Replace(X(3) & PP & X(4), "集保戶股權分散表", "")
.Open
.Writetext TT
.SaveToFile ThisWorkbook.Path & "\" & vFile, 2
.Close
Beep
End With
End If
Set XML = Nothing
End Sub
==================================
附件下載:
20151108-01(保戶股權分散表查詢).rar (10.48 KB)
|
|