excel爬虫相关学习2:excel 和 vba 爬虫相关xmlhttp方法

news/2024/7/19 11:11:26 标签: excel, 爬虫, 学习

目录

前言: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: 是否同步执行。
  1. 缺省为True,即异步执行,
  2. 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)


 


http://www.niftyadmin.cn/n/452217.html

相关文章

主成分分析(Principal Component Analysis, PCA)原理全面解析与应用

目录 1. PCA算法概述2. 数据预处理3. 协方差矩阵计算4. 特征值与特征向量5. 选择主成分6. 数据投影7. PCA的优缺点8. PCA算法应用 主成分分析&#xff08;Principal Component Analysis, PCA&#xff09;是一种常用的降维技术&#xff0c;用于数据的特征提取和数据可视化。本文…

FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)

2019 级 电子科学与技术 专业FPGA课程设计 报 告 2022 年 5 月 20 日 多功能数字电子钟的设计 摘要 电子设计自动化&#xff08;EDA&#xff09;是一种实现电子系统或电子产品自动化设计的技术&#xff0c;使用EDA技术设计的结果既可以用FPGA / CPLD来实施验证&#xff0c;…

vue配置反向代理的使用

反向代理&#xff1a;常用于生产环境&#xff0c;项目部署时服务器的配置。 反向代理&#xff1a;同样创建一个代理服务器&#xff0c;用于接收客户端发送的请求&#xff0c;再将请求转发给内部网络上的服务器&#xff0c;从服务器中获取数据并返回给客户端。也就是 代理服务端…

STM32--基于固件库(Library Faction)的led灯点亮

目录 一、STM32芯片的简单介绍 二、基于固件库&#xff08;Library Faction&#xff09;的led灯点亮 这是一个学习stm32的开端&#xff0c;我们由简入难&#xff0c;之前学过C51/52或是其他型号的一般都是从led开始&#xff0c;也就是简单的输入输出端口的应用。&#xff08;想…

Java中关于字符串常量池的详解!!!

字符串常量池 前言1. 直接赋值法&#xff0c;默认从常量池中取对象2. new一个对象3. 字符串常量池、字符串对象、内部的value引用、具体的字符数组之间的关系4. 手动入池方法&#xff1a;intern方法 前言 Java使用 “ ” 称为字符串常量&#xff0c;为了提高程序的运行速度&am…

Java官方笔记12异常

Exception Definition: An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the programs instructions. the checked exception 比如&#xff0c;java.io.FileNotFoundException the error 比如&#xff0c;java.i…

向量数据库的行业标准逐渐清晰!Vector DB Bench 正式开源!

大模型带火了向量数据库赛道&#xff0c;也让各式各样的向量数据库进入开发者视野。 对于开发者而言&#xff0c;如何选择一个适合自己的向量数据库至关重要。不过&#xff0c;向量数据库的选型并不简单&#xff0c;开发者不仅需要对市面上各种开源和闭源的数据库进行全面的性能…

全屋智能家居搭建初级指南(装修用户)

环境&#xff1a; 小M等智能设备 新装修用户 稳定网络环境 规划好电路布局 问题描述&#xff1a; 全屋智能家居如何搭建&#xff0c;初级指南&#xff08;装修用户&#xff09; 下面部分内容摘自小M智能家居解决方案&#xff1a; 一、装修中需要注意什么&#xff1f; …