首先代碼如下:
Inet1.Execute URL, "POST", _
data, _
"Content-Type: application/x-www-form-urlencoded"
Do While Inet1.StillExecuting
DoEvents
Loop
Dim b() As Byte
b = Inet1.GetChunk(0, icByteArray)
InetPOST = Utf8ToUnicode(b)
由于要采集網站的資料,所以要回圈POST,有1個page的引數,使用中發現POST過去的不管是page=1還是page=2或者其他的數字,回傳的都是page=1的內容(實際上每個頁面是不同的內容),但是等幾分鐘后再發送page=2,回傳就是page=2的內容,如果這時候再發送page=1或者page=3,回傳的還是page=2的內容,請問高手inet是有快取這回事嗎?我該怎樣做才能解決這個問題?
uj5u.com熱心網友回復:
Option Explicit
Private Const INTERNET_OPEN_TYPE_PRECONFIG = 0
Private Const INTERNET_OPEN_TYPE_DIRECT = 1
Private Const INTERNET_OPEN_TYPE_PROXY = 3
Private Const scUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
Private Const INTERNET_FLAG_RELOAD = &H80000000
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hOpen As Long, ByVal sURL As String, ByVal sHeaders As String, ByVal lLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function InternetReadFileByte Lib "wininet.dll" Alias "InternetReadFile" (ByVal hFile As Long, ByRef sBuffer As Byte, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
Private Declare Function HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA" (ByVal hHttpRequest As Long, ByVal lInfoLevel As Long, ByVal sBuffer As Any, ByRef lBufferLength As Long, ByRef lIndex As Long) As Integer
Const HTTP_QUERY_CONTENT_LENGTH = 5
Const HTTP_QUERY_FLAG_NUMBER = &H20000000
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal lpszServerName As String, ByVal nProxyWebPort As Integer, ByVal lpszUsername As String, ByVal lpszPassword As String, ByVal dwService As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
Private Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" (ByVal hInternetSession As Long, ByVal lpszVerb As String, ByVal lpszObjectName As String, ByVal lpszVersion As String, ByVal lpszReferer As String, ByVal lpszAcceptTypes As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
Private Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal sOptional As String, ByVal lOptionalLength As Long) As Boolean
Private Declare Function HttpAddRequestHeaders Lib "wininet.dll" Alias "HttpAddRequestHeadersA" (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal lModifiers As Long) As Integer
Private Function IsNullBytes(ByRef sBytes() As Byte) As Boolean
On Error Resume Next
Dim N As Long
N = UBound(sBytes())
If Err Then
IsNullBytes = True
End If
End Function
'Get
Public Function WinInetGet(ByVal sURL As String, Optional ByVal lNewBufferSize As Long = 2048) As Byte()
Dim bBuffer() As Byte
Dim lBufferSize As Long
Dim retBytes() As Byte
Dim hOpen As Long
Dim hOpenUrl As Long
Dim hQuery As Long
Dim lFileSize As Long
Dim sQuery As String
Dim i As Long
Dim lBufferNumber As Long
Dim lRealFileLen As Long
Dim bDoLoop As Boolean
Dim lNumberOfBytesRead As Long
Dim BSize As Long
On Error GoTo FindErr
If lNewBufferSize <> 2048 Then
lBufferSize = lNewBufferSize
If lBufferSize < 1024 Then lBufferSize = 1024
Else
lBufferSize = lNewBufferSize
End If
ReDim bBuffer(lBufferSize - 1) As Byte
hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
hOpenUrl = InternetOpenUrl(hOpen, sURL, vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
sQuery = String$(1024, " ")
hQuery = HttpQueryInfo(hOpenUrl, HTTP_QUERY_CONTENT_LENGTH, ByVal sQuery, Len(sQuery), 0)
If hQuery Then
lFileSize = CLng(Trim(sQuery))
Else
lFileSize = -1
End If
If lFileSize <> -1 Then
bDoLoop = True
lBufferNumber = Fix(lFileSize / lBufferSize)
If lFileSize Mod lBufferSize <> 0 Then lBufferNumber = lBufferNumber + 1
lRealFileLen = 0
For i = 1 To lBufferNumber
If i < lBufferNumber Then
bDoLoop = InternetReadFileByte(hOpenUrl, bBuffer(0), lBufferSize, lNumberOfBytesRead)
Else
lBufferSize = lFileSize - lBufferSize * (i - 1)
ReDim bBuffer(lBufferSize - 1) As Byte
bDoLoop = InternetReadFileByte(hOpenUrl, bBuffer(0), lBufferSize, lNumberOfBytesRead)
End If
If IsNullBytes(retBytes) Then
ReDim retBytes(UBound(bBuffer))
retBytes = bBuffer
Else
BSize = UBound(retBytes)
ReDim Preserve retBytes(BSize + UBound(bBuffer) + 1)
Call CopyMemory(retBytes(BSize + 1), bBuffer(0), UBound(bBuffer) + 1)
End If
lRealFileLen = lRealFileLen + lNumberOfBytesRead
If Not CBool(lNumberOfBytesRead) Then Exit For
VBA.DoEvents
Next i
Else
i = 0
Do
i = i + 1
bDoLoop = InternetReadFileByte(hOpenUrl, bBuffer(0), lBufferSize, lNumberOfBytesRead)
If lBufferSize <> lNumberOfBytesRead Then
If lNumberOfBytesRead = 0 Or bDoLoop = 0 Then
Exit Do
Else
lBufferSize = lNumberOfBytesRead
ReDim Preserve bBuffer(lBufferSize - 1) As Byte
End If
End If
If IsNullBytes(retBytes) Then
ReDim retBytes(UBound(bBuffer))
retBytes = bBuffer
Else
BSize = UBound(retBytes)
ReDim Preserve retBytes(BSize + UBound(bBuffer) + 1)
Call CopyMemory(retBytes(BSize + 1), bBuffer(0), UBound(bBuffer) + 1)
End If
lRealFileLen = lRealFileLen + lNumberOfBytesRead
VBA.DoEvents
Loop
End If
If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl)
If hOpen <> 0 Then InternetCloseHandle (hOpen)
WinInetGet = retBytes
Exit Function
FindErr:
WinInetGet = VBA.vbNullChar
End Function
uj5u.com熱心網友回復:
'Post
Public Function WinInetPost(sURL As String, PostData As String) As Byte()
On Error GoTo Over
Dim IntOpen As Long, IntConnect As Long, XHttpOpenRequest As Long, BRet As Boolean, ScriptName As String, lRealFileLen As Long
If LCase(Left(sURL, 7)) = "http://" Then sURL = Right(sURL, Len(sURL) - 7)
If InStr(sURL, "/") Then
ScriptName = Right(sURL, Len(sURL) - InStr(sURL, "/") + 1)
sURL = Left(sURL, InStr(sURL, "/") - 1)
Else
ScriptName = "/"
End If
lRealFileLen = 0
IntOpen = 0
IntConnect = 0
XHttpOpenRequest = 0
Const INTERNET_OPEN_TYPE_PRECONFIG = 0
IntOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
If IntOpen <> 0 Then
Const INTERNET_SERVICE_HTTP = 3
Const INTERNET_DEFAULT_HTTP_WebPort = 80
IntConnect = InternetConnect(IntOpen, sURL, INTERNET_DEFAULT_HTTP_WebPort, vbNullString, "HTTP/1.0", INTERNET_SERVICE_HTTP, 0, 0)
If IntConnect <> 0 Then
Const INTERNET_FLAG_RELOAD = &H80000000
XHttpOpenRequest = HttpOpenRequest(IntConnect, "POST", ScriptName, "HTTP/1.0", vbNullString, 0, INTERNET_FLAG_RELOAD, 0)
If XHttpOpenRequest <> 0 Then
Dim HttpHeader As String
Const HTTP_ADDREQ_FLAG_ADD = &H20000000
Const HTTP_ADDREQ_FLAG_REPLACE = &H80000000
HttpHeader = "Content-Type: application/x-www-form-urlencoded" & vbCrLf
BRet = HttpAddRequestHeaders(XHttpOpenRequest, HttpHeader, Len(HttpHeader), HTTP_ADDREQ_FLAG_REPLACE Or HTTP_ADDREQ_FLAG_ADD)
BRet = HttpSendRequest(XHttpOpenRequest, vbNullString, 0, PostData, Len(PostData))
Dim TheLoop As Boolean, RBuffer As String * 2048, ByteNumberRead As Long, IBuffer As String
Dim bBuffer() As Byte, retBytes() As Byte, lBufferSize As Long, BSize As Long, i As Long, lNumberOfBytesRead As Long
lBufferSize = 2048
ReDim bBuffer(lBufferSize - 1) As Byte
i = 0
Do
i = i + 1
TheLoop = InternetReadFileByte(XHttpOpenRequest, bBuffer(0), lBufferSize, lNumberOfBytesRead)
If lBufferSize <> lNumberOfBytesRead Then
If lNumberOfBytesRead = 0 Or TheLoop = 0 Then
Exit Do
Else
lBufferSize = lNumberOfBytesRead
ReDim Preserve bBuffer(lBufferSize - 1) As Byte
End If
End If
If IsNullBytes(retBytes) Then
ReDim retBytes(UBound(bBuffer))
retBytes = bBuffer
Else
BSize = UBound(retBytes)
ReDim Preserve retBytes(BSize + UBound(bBuffer) + 1)
Call CopyMemory(retBytes(BSize + 1), bBuffer(0), UBound(bBuffer) + 1)
End If
lRealFileLen = lRealFileLen + lNumberOfBytesRead
VBA.DoEvents
Loop
WinInetPost = retBytes
BRet = InternetCloseHandle(XHttpOpenRequest)
End If
BRet = InternetCloseHandle(IntConnect)
End If
BRet = InternetCloseHandle(IntOpen)
End If
Exit Function
Over:
WinInetPost = VBA.vbNullChar
End Function
Public Function BytesToBstr(Bytes, Optional Charset As String)
Dim objstream As Object
Set objstream = CreateObject("ADODB.Stream")
With objstream
.Type = 1
.Mode = 3
.Open
.Write Bytes
.Position = 0
.Type = 2
.Charset = Charset
BytesToBstr = .ReadText
.Close
End With
End Function
'呼叫示例
'Debug.Print WinInetGet("http://127.0.0.1/index.html")
'上面兩個函式都是回傳byte陣列,如果出現亂碼可以通過以下這個函式安指定編碼轉換一下就可以了。
'比如:
'Debug.Print BytesToBstr(WinInetPost("http://127.0.0.1/index.php", "UserName=admin"), "UTF-8")
這個是別人寫的一個WinInetGetPost模塊,post可以傳遞多個引數UserName=admin,password=fdsafdsa,s=1
引數用逗號隔開就可以了
一次沒有發完,上面跟下面的代碼是一起的
uj5u.com熱心網友回復:
http://zhidao.baidu.com/question/63298082uj5u.com熱心網友回復:
如果 POST 和上次請求的 url 一致,并且快取有效,就會回傳快取。可以加上 Pragma:no-cache 引數,指定不使用快取。
uj5u.com熱心網友回復:
http://bbs.csdn.net/topics/40098997uj5u.com熱心網友回復:
http://bbs.csdn.net/topics/391920007轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/72129.html
標籤:網絡編程
上一篇:[求助]VBA word 宏設定
