Board logo

標題: [發問] 網頁資料下載成pdf異常地慢? [打印本頁]

作者: lalalada    時間: 2013-5-10 22:05     標題: 網頁資料下載成pdf異常地慢?

使用最普遍的方法Microsoft.XMLHTTP +ADODB.STREAM
下載 https://mm.jpmorgan.com/OpenPubServlet?action=latest&publication=9000024 的pdf檔
但是速度卻驚人的慢... 接近30秒
用相同方法下載其他資料 如 http://ichart.finance.yahoo.com/table.csv?s=2498.TW&d=4&e=10&f=2013&g=d&a=2&b=26&c=2002&ignore=.csv
只需要一瞬間(因為檔案格式的關係嗎? pdf v.s. csv)
雖然有下載成功 可是其中發生了什麼問題 能改善嗎?
謝謝!
  1. Sub download1()
  2. 'On Error Resume Next
  3. DataDate = Year(Date) & "-" & Format(Month(Date), "00") & "-" & Day(Date)
  4. myURL = "https://mm.jpmorgan.com/OpenPubServlet?action=latest&publication=9000024"


  5. Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
  6. WinHttpReq.Open "GET", myURL, False
  7. WinHttpReq.Send

  8. myURL = WinHttpReq.ResponseBody
  9. If WinHttpReq.Status = 200 Then
  10.     Set oStream = CreateObject("ADODB.Stream")
  11.     oStream.Open
  12.     oStream.Type = 1
  13.     oStream.Write WinHttpReq.ResponseBody
  14.     oStream.SaveToFile ("D:\Dropbox\Stock\Research Reports\JPM Top Stories\JPM_J.P._Morgan_FTM_10_M_" & DataDate & ".pdf")
  15.     oStream.Close
  16. End If
  17. 'On Error GoTo 0

  18. End Sub
複製代碼

作者: mark15jill    時間: 2013-5-13 11:09

使用最普遍的方法Microsoft.XMLHTTP +ADODB.STREAM
下載 https://mm.jpmorgan.com/OpenPubServlet?action= ...
lalalada 發表於 2013-5-10 22:05



    格式不同.... 當然慢...
    嚴格來說... PDF 不算是文件檔案...  只能算半圖文檔...  雖然可以藉由軟體加以擷取..
    同樣大小的圖片和文字  基本上  圖片傳輸速度會遠低於 文字傳輸速度...  當中的原因 可以自己想想...
作者: lalalada    時間: 2013-5-13 23:36

回復 2# mark15jill

感謝回復!
那請問有沒有辦法能改善這現象呢?

而且我注意到如果重複跑程式碼
第二次之後就能達到瞬間執行完畢@@
作者: mark15jill    時間: 2013-5-14 11:53

回復  mark15jill

感謝回復!
那請問有沒有辦法能改善這現象呢?

而且我注意到如果重複跑程式碼
第二 ...
lalalada 發表於 2013-5-13 23:36


如果是 第二次跑  瞬間跑完的話  那有可能是 暫存傳輸的問題...
暫存傳輸的意思就是說
A電腦 要從 B平台下載東西
從B取得資料頁面後,A的電腦會先以暫存的方式 將檔案留存下來,在正式下載的時候,速度就會稍微快...
這問題 會牽連到  網速 和 電腦CPU ....
改善方法... 重複跑兩次.. 第一次遮蔽.. (消極!)
作者: lalalada    時間: 2013-5-15 01:06

回復 4# mark15jill

了解~
感謝指教:)
請問...重複跑兩次(遮蔽第一次)是什麼意思(?)
這樣跑第一次的時候還是要一樣久不是嗎?
既然網址都一樣
有沒有辦法把暫存檔留下來呢?
作者: mark15jill    時間: 2013-5-16 11:07

回復 5# lalalada


    網址有兩種
一種是 標題列那邊的網址
另外一種是' 文件的網址
雖然有時候  第一種網址 是相同   可是  裡面的連結網址會不同
所以 暫存檔不會是相同~~
舉例來說
麻辣家族討論區的網址為 http://forum.twbts.com/
裡面的文章列 又會是另外一種網址
而 如果有附件下載  又會是另外一種

至於方法...
那個還沒研究ˇˇ 抱歉
作者: 准提部林    時間: 2013-5-17 09:38

使用〔XMLHTTP〕語法,有時會有如下狀況:
第1次執行慢 > 類似從傳真機接收〔正本〕文件的〔副本〕,從〔無〕到〔有〕,總是要等些時間
第2次以後執行快 > 只是拿到〔傳真副本〕的〔影印本〕
如果〔正本〕每天更新,還是必須重新執行傳真動作,取得最新的〔副本〕,耗費的時間相同,
假如每次下載都是要取得最新版本資料,若下載速度異常的快,必須去確認是否為最新!

在某些PC上,即使關掉網路連線,還是可以下載文件,因為〔傳真副本〕還在暫存區,抓到的文件,有人形容為〔鬼影〕!
網上去查一下〔GET〕及〔POST〕的差別,但改用〔POST〕有時還是不夠精確!

以上純為個人實作經驗,並非一定是如此,僅供參考!
作者: lalalada    時間: 2013-5-19 12:34

回復 7# 准提部林

你好! 感謝回覆
我大概會用POST跟GET兩種方法取得資料
個人理解POST是有發出訊息給對方伺服器
伺服器再根據訊息給予對應的資料
GET則是單純存取
請問這樣的理解正確嗎?
又POST不精確的意思是什麼...?
作者: lalalada    時間: 2013-5-19 12:56

回復 6# mark15jill

你好~感謝回覆!
我也有注意到網址結尾並不是PDF
請問有沒有辦法得到文件的真實位址呢?
作者: 准提部林    時間: 2013-5-19 13:25

<測試碼>
Sub 測試_1()
Dim QcURL$, uTxt$, X1&, X2&
On Error GoTo 101
QcURL = "http://www.post.gov.tw/post/internet/index.jsp"
With CreateObject("Microsoft.XMLHTTP")
     .Open "post", QcURL, False
     .send
     uTxt = .ResponseText
End With
'---------------------------
T1 = "台灣時間:</span> <span class='time'>"
T2 = "GMT+8:00  "
X1 = InStr(uTxt, T1)
If X1 > 0 Then X2 = InStr(X1 + Len(T1), uTxt, T2)
If X2 = 0 Then Exit Sub
uTxt = Mid(uTxt, X1 + Len(T1), X2 - X1 - Len(T1))
'---------------------------
uTxt = Replace(Replace(uTxt, "&nbsp", ""), ";", "")
If Len(uTxt) = 0 Then Exit Sub
[A65536].End(xlUp)(2) = uTxt
101: End Sub

請再複製一份,改為〔Sub 測試_2()〕,且將〔post〕改為〔get〕!

檢測執行:
1.先執行幾次〔測試1〕,看文字串後面的時間是否有更新?__102年5月19日星期日12:52:24
2.再執行幾次〔測試2〕
3.接著再執行〔測試1〕

以我的PC測試:
在未執行GET前,POST都可以取得最新時間;執行GET後,後續都是抓到舊時間,即使再返回執行POST也是一樣!
不過您的PC並不一定如此,參考即可!
作者: lalalada    時間: 2013-5-20 04:48

回復 10# 准提部林

嗨~
感謝回覆!
看完這些程式碼又多學了一些東西 :P
dim 後面的$和&是指定型別的意思吧?

經過測試
使用get只有第一次有效
post則能一直獲取當前時間
不過get後post依然有效
可是不了解為什麼....?

另外一時興起就試著把程式碼簡化如下XD
  1. Sub 測試_1()
  2. Dim QcURL$
  3. On Error GoTo 101
  4. QcURL = "http://www.post.gov.tw/post/internet/index.jsp"
  5. With CreateObject("Microsoft.XMLHTTP")
  6.      .Open "post", QcURL, False
  7.      .send
  8.      test1 = Split(Split(.responseText, "台灣時間:</span> <span class='time'>&nbsp;")(1), "&nbsp;GMT+8:00  </span></td>")(0)
  9. End With
  10. [A65536].End(xlUp)(2) = Replace(Replace(test1, "&nbsp", ""), ";", "")
  11. 101: End Sub
複製代碼

作者: 准提部林    時間: 2013-5-20 16:20

回復 11# lalalada

1.dim 後面的$和&是指定型別的意思吧?
__可以參考超級版主的說明:http://forum.twbts.com/redirect. ... 22366&ptid=3820

2.〔get〕〔post〕為何有差?
__不是excel及vba正科,根本不懂其機制,看過超級版主的程式碼非常道地而專業,或許可以提供專業知識分享!
  另,在網址上加入變動參數,使用〔get〕也可抓出最新數據,但可能無法適用所有的網址,例如:
  QcURL = "http://www.post.gov.tw/post/internet/index.jsp?" & Rnd
  這也是知其然而不知其所以然,大概ie有自動校正網址的原因吧!(猜)

3.測試碼因從幾個子程序中湊成,一時將就;經貴手精簡後,看起來清爽許多!^ ^
  因為有反覆取指定字串需求,一般會以子程序或function來呼叫,約略如下:
Sub 取得指定字串()
Dim uTxt$, T1$, T2$
uTxt = "所在地:台灣,日期:102年5月19日,星期別:星期日,時間:12:52:24(TM)"
T1 = "日期:": T2 = ",星期"
MsgBox Get_String(uTxt, T1, T2)
T1 = "時間:": T2 = "(TM)"
MsgBox Get_String(uTxt, T1, T2)
End Sub

Function Get_String(xStr$, xT1$, xT2$) As String
Dim X1%, X2%
X1 = InStr(xStr, xT1)
If X1 > 0 Then X2 = InStr(X1 + Len(xT1), xStr, xT2)
If X2 = 0 Then Exit Function
Get_String = Mid(xStr, X1 + Len(xT1), X2 - X1 - Len(xT1))
End Function

非正統的程式碼,看看就好!
作者: lalalada    時間: 2013-5-20 21:30

回復 12# 准提部林

哦哦了解! 感謝你~

加入亂數有效是因為?後面的東西就是使用post時丟都進去的參數
既然丟了參數
對方伺服器就會回應 所以可以取得最新資料
因為它實際上就跟post一樣
不適用的情況同理

看來get是去取得暫存檔(?)




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