台灣最大程式設計社群網站
線上人數
1001
 
會員總數:244892
討論主題:188887
歡迎您免費加入會員
討論區列表 >> VB.NET >> 用 VBA抓取網頁資料, 遇到安全保護 secretToken. 惠請高手大德指點
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
用 VBA抓取網頁資料, 遇到安全保護 secretToken. 惠請高手大德指點
價值 : 50 QP  點閱數:473 回應數:0

樓主

A9
初學者
10 2
73 11
發送站內信

用 VBA抓取網頁資料, 遇到安全保護. 惠請高手大德指點

0.目的:用 VBA抓取網頁資料(網路爬蟲),儲存到 ACCESS資料庫內
1.問題:傳遞FormData參數,遇到有安全保護. 其中csrf和secretToken不知道如何處理產生,惠請指點.
2.網址: https://www.nvesto.com/
3.股票代號:2330(台積電)
4.想抓取的資料: 個股/籌碼面/主力進出/券商分行

5.自己寫的程式碼 片段:
Public Sub S310b(stkno As String, day00 As String) '取得 股票代號(stkno) 在day00當日 主力進出資料 並增補入 T31 表內
'資料來源2-Nvesto網站/籌碼面/主力進出 https://www.nvesto.com/tpe/2330/majorforce/ajaxGetData
Dim X1 As Object '網頁擷取 物件變數
Dim U0 As String '網址字串變數
Dim PP As String '網頁擷取資料 本文內容
Dim r0 As Recordset, r As Recordset '記錄叢集變數 (處理系統表msysobjects 查核 表 是否存在於資料庫內
Dim q As QueryDef '查詢定義物件變數 (DAO:Data Access Objec 數據接口) 用來下達 SQL 指令
Dim ss As String, s0 As String '字串變數
Dim s1 As String, s2 As String, s3 As String, s4 As String '字串變數
Dim i As Long, m As Long '迴路控制變數
Dim j0 As Single '暫存變數 for 處理 佔成交百分比
Dim T31 As String '資料表名稱變數
Dim tt0 As String '網頁擷取資料 本文內容
Dim T0() As String, T1() As String '切割處理內容 暫存變數
'------------------------------------------------------------------------檢查 指定日期之記錄,是否存在 T31表中
T31 = "T31_" & stkno '設定 欲處理之 主力進出資料表 表名稱
ss = "SELECT date31 FROM " & T31 & " WHERE date31='" & day00 & "' ;" '設定選取條件: 找出指定日期之記錄,是否存在主力進出資料表內
Set r = DB31.OpenRecordset(ss, DB_OPEN_DYNASET) '開啟 數據集 指標, 選取符合條件之資料 選取出來 放置於 數據集內
If Not (r.EOF) Then GoTo L_99 '記錄 已存在表內, 跳到 L_99:行號處執行 (不抓取資料,結束執行)
Set r = Nothing '釋放 變數記憶體
'------------------------------------------------------------------------第一次 抓取 Nvesto網站 需要先 login
U0 = "https://www.nvesto.com/user/login?normal_login=1"
PP = "LoginForm%5Bemail%5D=yarchen%40ms21.hinet.net&LoginForm%5Bpassword%5D=xxxxxxxx&LoginForm%5BrememberMe%5D=0&LoginForm%5BrememberMe%5D=1"
Ck0 = "uuid=13a0b82a-e87b-465a-8bae-877e17b2de8d; PHPSESSID=uigrupu29unpanm3fedag5ln53;"
Set X1 = CreateObject("Microsoft.XMLHTTP") '設定 網頁擷取物件 指標
With X1 '設定簡化X1 起始範圍 (執行一系列重複參考單一物件或結構的陳述式,使陳述式在存取物件或結構的成員時,可以使用簡化的語法)
.Open "POST", U0, False '設定網頁擷取,以POST方式,設定連接網址
.setRequestHeader "Accept", "application/json, text/javascript, */*; q=0.01"
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
.setRequestHeader "Accept-Encoding", "gzip, deflate, br"
.setRequestHeader "Accept-Language", "zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6,ja;q=0.5"
.setRequestHeader "Connection", "keep-alive" '設定 要求表頭資料 連接方式
.setRequestHeader "Cookie", Ck0 '設定 要求表頭資料 Cookies (非常重要)
.setRequestHeader "Referer", U0 '設定 要求表頭資料 參考網址
.Send (PP) '第01次網頁擷取 POST (發送網頁資料擷取要求,傳送參數,執行網頁擷取資料)
Err.Clear '清除 系統錯誤標誌
On Error GoTo 0 '取消目前程序堛瑪欞~處理
'-----------------------------------------------------------------------'檢核 網頁資料內容 設定 Cookies
If Not IsNull(.getAllResponseHeaders) Then
ss = .getAllResponseHeaders
T0 = Split(ss, "Set-Cookie:")
If (UBound(T0) >= 1) Then
For i = 1 To UBound(T0)
Ck1(i) = Split(T0(i), ";")(0)
Next
Ck0 = Ck1(i - 1)
End If
End If
End With '設定簡化X1 終止範圍
Set X1 = Nothing

'------------------------------------------------------------------------設定網址與參數 準備抓取網頁資料
s0 = CV_YMD4a(day00) '轉換日期格式 已利置入網頁擷取 傳遞參數中
'gSleep (2) '延遲2秒鐘 比較不會被 網頁流量限制
'Ck0 = "uuid=13a0b82a-e87b-465a-8bae-877e17b2de8d; PHPSESSID=uigrupu29unpanm3fedag5ln53; 2bd8f60281051886518bc3f76c3bc3b8=254285f48cb883490256bc8ae7aa730cfb06c629a%3A4%3A%7Bi%3A0%3Bs%3A5%3A%2262417%22%3Bi%3A1%3Bs%3A6%3A%22Oldman%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A1%3A%7Bs%3A13%3A%22lastLoginTime%22%3Bi%3A1542693594%3B%7D%7D;"
Set X1 = CreateObject("Microsoft.XMLHTTP") '設定 網頁擷取物件 指標
On Error Resume Next '設定 未知錯誤處理 (如果執行網頁抓取發生錯誤,忽略錯誤 繼續執行下一行指令)
With X1
U0 = "https://www.nvesto.com/tpe/2330/majorforce/ajaxGetData"
'PP = "fromdate=2018-11-19&todate=2018-11-19&view=detail&csrf=wiyIZZ-vUE-AycycObm-d7gyEhr3MU6nCH7JhpjJOrp3wZZrIyBWNyR4PFRIBm-aewR9FIYkK6Geb8-B7Majki-Zfc16xloj&secretToken=8397478feff0efaa7ef031fd643d4052"
PP = "fromdate=2018-11-19&todate=2018-11-19&view=detail"
.Open "POST", U0, False '設定網頁擷取,以POST方式,設定連接網址
.setRequestHeader "Accept", "application/json, text/javascript, */*; q=0.01"
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
.setRequestHeader "Accept-Encoding", "gzip, deflate, br"
.setRequestHeader "Accept-Language", "zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6,ja;q=0.5"
.setRequestHeader "Connection", "keep-alive" '設定 要求表頭資料 連接方式
.setRequestHeader "Cookie", Ck0 '設定 要求表頭資料 Cookies (非常重要)
.setRequestHeader "Referer", U0 '設定 要求表頭資料 參考網址
.Send (PP) '第二次網頁擷取 POST (發送網頁資料擷取要求,傳送參數,執行網頁擷取資料)
Err.Clear '清除 系統錯誤標誌
On Error GoTo 0 '取消目前程序堛瑪欞~處理
'-----------------------------------------------------------------------'檢核 網頁擷取資料(集保股權分布)的正確性
If (.status <> 200) Or (.ReadyState <> 4) Then '擷取失敗 (網頁無法讀取)(延時過久)(內容長度不足)
ss = "擷取失敗(主力進出-資料) " & stkno & "-" & day00 '設定和顯示錯誤訊息
Call S_T90rec("E", "T31", ss) '將記錄 寫入T90表
Form_M000.gMsg4 = ss
GoTo L_99 '跳到 L_99:行號處執行 (不抓取資料,結束執行)
End If
tt0 = .responsetext
'-----------------------------------------------------------------------'檢核 網頁切割 資料內容的正確性(集保股權分布)
If (InStr(tt0, mk00) > 0) Or (Len(tt0) < xln) Then '本日休市 或 格式不符 跳到 L_99:行號處執行 (不抓取資料,結束執行)
ss = "格式不符(主力進出-資料) " & stkno & "-" & day00
Call S_T90rec("E", "T31", ss) '將記錄 寫入T90表
Form_M000.gMsg4 = ss
GoTo L_99 '跳到 L_99:行號處執行 (不抓取資料,結束執行)
End If
End With '設定簡化X1 終止範圍
Set X1 = Nothing '釋放 網頁擷取物件
'-----------------------------------------------------------------------(切割網頁內容 取得當日個股股票代號之主力進出資料 日期、主力戶號、買進量、賣出量…)
....................................
L_99: 'L_99: 行號標籤位置
Set q = Nothing '釋放 變數記憶體
End Sub


搜尋相關Tags的文章: [ 網頁抓取 ] , [ 網路爬蟲 ] , [ 安全保護 ] , [ secretToken ] ,
本篇文章發表於2018-11-21 21:30
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
   

回覆
如要回應,請先登入.