目录
前言:vba 爬虫相关xmlhttp的方法
1 什么是xmlhttp
1.1 定义
1.2 特点
定义XMLHTTP对象:
XMLHTTP方法:
open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword)
send(varBody)
setRequestHeader(bstrHeader, bstrValue)
abort
getAllResponseHeaders
getResponseHeader("header")
XMLHTTP属性:
前言:vba 爬虫相关xmlhttp的方法
- 除了EXCEL里直接用 来自网站可以爬数据
- VBA也可以写爬虫代码
- 但是设计 xmlhttp 相关的内容
1 什么是xmlhttp
1.1 定义
- 顾名思义,XMLHTTP是个传送XML格式数据的超文本传输协议。
- XMLHTTP的数据传输过程更为灵活一些:
- 下面是网上说灵活的地方(看起来一般,可能现在是标配了把)
- 它上传的指令可以是XML格式数据,也可以是字符串,流,或者一个无符号整数数组。还可以是URL的参数。
- 它下达的结果可以是XML格式数据,也可以是字符串,流,或者一个无符号整数数组。
1.2 特点
- 也是跨语言的
- 现在所知的,vb,js
1.3 创建和类型
客户端调用XMLHTTP的过程很简单,只有5个步骤:
1、创建XMLHTTP对象
2、打开与服务端的连接,同时定义指令发送方式,服务网页(URL)和请求权限等。
客户端通过Open命令打开与服务端的服务网页的连接。与普通HTTP指令传送一样,可以用"GET"方法或"POST"方法指向服务端的服务网页。
3、发送指令。
4、等待并接收服务端返回的处理结果。
5、释放XMLHTTP对象
例子是下面代码,有点问题
Sub t1()
strUrl = "http://www.86pm25.com/paiming.htm"
getHtmlStr (strUrl)
End Sub
Public Function getHtmlStr(strUrl)
Dim XmlHttp
Set XmlHttp = CreateObject("Microsoft.XMLHTTP")
XmlHttp.Open "GET", strUrl, True
XmlHttp.send
Content = XmlHttp.responsetext
ThisWorkbook.Sheets("sheet5").Cells(1, 1) = Content
' getHtmlStr = StrConv(XmlHttp.ResponseBody, vbUnicode)
' Set XmlHttp = Nothing
End Function
2 定义XMLHTTP对象:
(vbs)
Msxml2.XMLHTTP是高版本,受msxml3.dll+支持
Microsoft.XMLHTTP是低本,一般是msxml2.6以下版本使用
- dim objxml as object
- Set objXML = CreateObject("Msxml2.XMLHTTP")
- Set objXML = CreateObject("Microsoft.XMLHTTP")
(javascript)
- var xml = new ActiveXObject("Microsoft.XMLHTTP")
- Set xml = Server.CreateObject("MSXML2.ServerXMLHTTP")
3 XMLHTTP方法:
Microsoft.XMLHTTP_百度百科含义Microsoft.XMLHttp组件的属性方法https://baike.baidu.com/item/Microsoft.XMLHTTP/5265442?fr=aladdin
3.1 open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword)
open 创建一个新的http请求,并指定此请求的方法、URL以及验证信息(用户名/密码)
XMLHttpRequest.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword);
参数
bstrMethod http方法,例如:POST、GET、PUT及PROPFIND。大小写不敏感。
bstrUrl 请求的URL地址,可以为绝对地址也可以为相对地址。
varAsync[可选] 布尔型,指定此请求是否为异步方式,默认为true。
bstrUser[可选] 如果服务器需要验证,此处指定用户名,如果未指定,当服务器需要验证时,会弹出验证窗口。
bstrPassword[可选] 验证信息中的密码部分,如果用户名为空,则此值将被忽略。
调用open方法后,会将readyState修改为1。
3.1.1 open(get,)
- bstrMethod: 数据传送方式,即GET或POST。用"POST"方式发送数据,可以大到4MB,也可以换为"GET",只能256KB。
- bstrUrl: 服务网页的URL。
- varAsync: 是否同步执行。
- 缺省为True,即异步执行,
- False,同步执行只能在DOM中实施同步执行。
- bstrUser: 用户名,可省略。
- bstrPassword:用户口令,可省略。
3.1.2 open(post ,)
Open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword)创建一个新的http请求,并指定此请求的方法、URL以及验证信息(用户名/密码)打开指定网址
bstrMethod: 数据传送方式,即GET或POST。
bstrUrl: 服务网页的URL。
varAsync: 是否同步执行。缺省为True,即同步执行,但只能在DOM中实施同步执行。用中一般将其置为False,即异步执行。
bstrUser: 用户名,可省略。
bstrPassword:用户口令,可省略。
setRequestHeader(bstrHeader, bstrvalue)
bstrHeader:HTTP 头(header)
bstrvalue: HTTP 头(header)的值
如果Open方法定义为POST,可以定义表单方式上传:
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
3.2 send(varBody)
- varBody:指令集。
- 可以是XML格式数据,
- 也可以是字符串,流,或者一个无符号整数数组。
- 也可以省略,让指令通过Open方法的URL参数代入。
- 发送数据的方式分为同步和异步两种。
- 在异步方式下,数据包一旦发送完毕,就结束Send进程,客户机执行其他的操作;
- 而在同步方式下,客户机要等到服务器返回确认消息后才结束Send进程。
send 发送请求到http服务器并接收回应
XMLHttpRequest.send(varBody);
参数
varBody 欲通过此请求发送的数据。
调用send方法后,会先调用onreadystatechange方法,此时readyState状态为1,然后会已经进程将readyState修改为2、3、4
一般情况下,使用Ajax提交或者获取参数可以采用GET、POST方式,使用GET方法将要提交的参数写到open方法的url参数中,此时send方法的参数为null。
例如 :
var url = "login.jsp?user=XXX&pwd=XXX";
xmlHttpRequest.open("GET",url,true);
xmlHttpRequset.send();
此外,也可以使用send方法传递参数。使用send方法传递参数使用的是POST方法,需要设定Content-Type头信息,模拟HTTP POST方法发送一个表单,这样服务器才会知道如何处理上传的内容。参数的提交格式和GET方法中url的写法一样。设置头信息前必须先调用open方法。
例如:
xmlHttpRequest.open("POST","login.jsp",true);
xmlHttpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");
xmlHttpRequest.send("user="+username+"&pwd="+password);
需要注意的是根据提交方式的不同,两种提交方式分别调用后台的doGet方法和doPost方法。
3.3 setRequestHeader(bstrHeader, bstrValue)
- bstrHeader:HTTP 头(header)
- bstrValue:HTTP 头(header)的值
- 如果Open方法定义为POST,可以定义表单方式上传:
- xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
3.4 abort
- 取消/停止 当前 HTTP 请求
3.5 getAllResponseHeaders
- 从响应信息中检索所有的标头字段
3.6 getResponseHeader("header")
4 XMLHTTP属性:
Microsoft.XMLHTTP_百度百科含义Microsoft.XMLHttp组件的属性方法https://baike.baidu.com/item/Microsoft.XMLHTTP/5265442?fr=aladdin
4.1 xmlhttp的属性罗列
- onreadystatechange:在同步执行方式下获得返回结果的事件句柄。只能在DOM中调用。
- responseBody: 结果返回为无符号整数数组。
- responseStream: 结果返回为IStream流。
- responseText : 结果返回为字符串。
- responseXML: 结果返回为XML格式数据。
- status: Long型 服务器返回的HTTP状态码
- statusText : String型 服务器HTTP响应行状态
4.2 responseBody:
1、ResponseBody是二进制的数据,是服务器传来的没有经过任何加工的数据。
4.2 XmlHttp.responsetext 即是网页内容
2 ResponseText是按照utf-8编码把ResponseBody转换而成,也就是:ResponseText=ByteToStr(ResponseBody,"UTF-8")
Sub t1()
strUrl = "http://www.86pm25.com/paiming.htm"
getHtmlStr (strUrl)
End Sub
Public Function getHtmlStr(strUrl)
Dim XmlHttp
Set XmlHttp = CreateObject("Microsoft.XMLHTTP")
XmlHttp.Open "GET", strUrl, True
XmlHttp.send
r1 = XmlHttp.responsetext
' r2 = XmlHttp.responsexml
' r3 = XmlHttp.responsebody
' r4 = XmlHttp.responsestream
ThisWorkbook.Sheets("sheet5").Cells(1, 1) = r1
' ThisWorkbook.Sheets("sheet5").Cells(1, 2) = r2
' ThisWorkbook.Sheets("sheet5").Cells(1, 3) = r3
' ThisWorkbook.Sheets("sheet5").Cells(1, 4) = r4
' getHtmlStr = StrConv(XmlHttp.ResponseBody, vbUnicode)
' Set XmlHttp = Nothing
End Function
'''Function getHtmlStr(strUrl)
''' Dim XmlHttp
''' Set XmlHttp = CreateObject("Microsoft.XMLHTTP")
''' XmlHttp.Open "GET", strUrl, True
'''
'''' If XmlHttpRequest.status_code = 200 Then
'''
''' XmlHttp.send
'''
''' ' Content = XmlHttp.responsetext
''' ' arr1 = Split(Content, "<Holding>") 'You cannot dim arr1() at the beginning
''' ' arr2 = Split(arr1(1), "</Holding>")
''' ' Sheet3.Cells(i, 5) = arr2(0)
'''
'''
'''
''' ThisWorkbook.Sheets("sheet5").Cells(1, 1) = Content
''' getHtmlStr = StrConv(XmlHttp.ResponseBody, vbUnicode)
''' Set XmlHttp = Nothing
'''
'''' End If
'''End Function
必须绕一手?
r1 = XmlHttp.responsetext
ThisWorkbook.Sheets("sheet5").Cells(1, 1) = r1
这样就不行?
ThisWorkbook.Sheets("sheet5").Cells(1, 1) =XmlHttp.responsetext
这几种不能打印出来?
- responseBody: 结果返回为无符号整数数组。
- responseStream: 结果返回为IStream流。
- responseText : 结果返回为字符串。
readyState
XMLHTTP对象中的readyState属性能够反映出服务器在处理请求时的进展状况。客户机的程序可以根据这个状态信息设置相应的事件处理方法。属性值及其含义如下表所示:
值 说明
0 Response对象已经创建,但XML文档上载过程尚未结束
1 XML文档已经装载完毕
2 XML文档已经装载完毕,正在处理中
3 部分XML文档已经解析
4 文档已经解析完毕,客户端可以接受返回消息
readyState用来记录当前请求的状态,只读。
0(未初始化) 对象已创建,但是尚未初始化(尚未调用open方法)
1(初始化) 对象已初始化(调用了open方法),尚未调用send方法
2(发送数据) send方法已调用,但是当前的状态及http头未知
3(数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误
4(完成) 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据
当readyState发生改变时,调用onreadystatechange方法,onreadystatechange需要自己定义。
status长整形,此属性只读,返回当前请求的http状态码,此属性仅当数据发送并接收完毕后才可获取。
responseText 将响应信息作为字符串返回.只读
responseXML 将响应信息格式化为Xml Document对象并返回,只读
- onreadystatechange:在同步执行方式下获得返回结果的事件句柄。只能在DOM中调用。
- responseBody: 结果返回为无符号整数数组。
- responseStream: 结果返回为IStream流。
- responseText : 结果返回为字符串。
- responseXML: 结果返回为XML格式数据。
- status: Long型 服务器返回的HTTP状态码
- statusText : String型 服务器HTTP响应行状态
其他
onreadystatechange
在同步执行方式下获得返回结果的事件句柄。只能在DOM中调用。
response.write(objXML.responseText)