VBA爬网页数据

方法1 :CreateObject(“InternetExplorer.Application”)

Sub 方法1()
LinkStr = "https://www.csdn.net/"
Set ie = CreateObject("InternetExplorer.Application")
With ie
    .Visible = False
    .navigate LinkStr
    Do Until .readystate - 4
        DoEvents
    Loop
     Set oDom = .document
End With
       Debug.Print oDom.getElementsByTagName("p")(0).innertext
End Sub

PS:此方法会打开浏览器读取数据,虽然我们看不到打开浏览器是因为设置的:.Visible = False不可见,实际在后台操作。并且需要等待浏览器返回数据的时间,不然可能会跳出错误。

方法2 :CreateObject(“WinHttp.WinHttpRequest.5.1”)

Sub 方法2()
LinkStr = "https://www.csdn.net/"

Set xmlHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
 Set oDom = CreateObject("htmlFile")
With xmlHttp
    .Open "GET", LinkStr, False
    .send
    oDom.body.innerHTML = .ResponseText
End With
Debug.Print oDom.getElementsByTagName("p")(0).innertext
End Sub

PS:
1、此方法如果P标签内为汉字,返回的为乱码,
2、使用WPS用户访问外部网站会跳出安全频道的错误,局域网网址并不会出现,此问题暂时无解。
在这里插入图片描述

方法3:CreateObject(“msxml2.xmlhttp”)

Sub 方法3()
Dim oDom As Object
LinkStr = "https://www.csdn.net/"
Set oDom = CreateObject("htmlFile")
Set ms = CreateObject("msxml2.xmlhttp")
With ms
    .Open "GET", LinkStr, True
    .send
    oDom.body.innerHTML = .responseText
End With
Debug.Print oDom.getElementsByTagName("p")(1).innertext
End Sub

PS:
1、msxml2可以自动适应字符乱码问题,兼容性较强。
2、缺点对于对于已经访问的 网站,如果网站内更新的内容,仍然是以前的老数据。原因msxml2是读取的上次缓存的数据才造成的。
解决方案:程序运行前先清空浏览器缓存。使用:Shell "RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8 "。如果不行,请自行测试下其他方式,注释及方法纯个人理解,难免有差错。

Sub Clear_Temp_Files()
Shell "RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8 " '清除临时文件
End Sub

Sub Clear_Cookies()
Shell "RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2" '清除Cookies
End Sub

Sub Clear_History()
Shell "RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1" '清除历史记录
End Sub
 
Sub Clear_Form_Data()
Shell "RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 16" '清除表单数据
End Sub

Sub Clear_Saved_Passwords()
Shell "RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32" '清除记住的账号密码
End Sub
 
Sub Clear_All()
Shell "RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255" '清除所有
End Sub

Sub Clear_Clear_Add_ons_Settings()
Shell "RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 4351" '清除创建默认设置
End Sub

方法4: CreateObject(“Msxml2.ServerXMLHTTP”)

Sub 方法3()
Dim oDom As Object
LinkStr = "https://www.csdn.net/"
Set oDom = CreateObject("htmlFile")
Set ms =  CreateObject("Msxml2.ServerXMLHTTP")
With ms
    .Open "GET", LinkStr, False
    .send
    oDom.body.innerHTML = .responseText
End With
Debug.Print oDom.getElementsByTagName("p")(1).innertext
End Sub

PS:
1、与方法3基本一致,唯一不同是加上此方法不会造成数据缓存的问题,保证读取的数据都是最新的。
2、和方法2问题一样WPS用户访问外部网站会跳出安全频道的错误,局域网网址并不会出现,此问题暂时无解


解决CreateObject(“WinHttp.WinHttpRequest.5.1”)乱码问题

Function UrlFile(Url, Ucode) '获取网页源文件(网址,编码)
    Dim oServerXmlHttp, ObjStream, oStream
    Set oServerXmlHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
    oServerXmlHttp.Open "GET", Url, False
    oServerXmlHttp.send
    oStream = oServerXmlHttp.responseBody
    If Not IsEmpty(oStream) Then
        If InStr(1, oServerXmlHttp.getResponseHeader("content-type"), "charset", 1) Then '通过判断"content-type"是否有"charset"字符串来决定是否根据参数2转码(文本比较——不区分大小写)
            UrlFile = oServerXmlHttp.responseText
        Else
            Set ObjStream = CreateObject("Adodb.Stream") 'With...end with省略对象不可写在判断内
            ObjStream.Type = 1
            ObjStream.Mode = 3
            ObjStream.Open
            ObjStream.Write oStream
            ObjStream.Position = 0
            ObjStream.Type = 2
            ObjStream.Charset = Ucode
            UrlFile = ObjStream.ReadText
        
        End If
    Else
        UrlFile = ""
    End If
    
    Set ObjStream = Nothing: Set oServerXmlHttp = Nothing
End Function


Sub 读取整个网页()
tex = UrlFile("https://www.csdn.net/", "UTF-8")
Debug.Print tex
End Sub

其他问题(获取某个标签的值)

使用以下方法时有时会出现自动打开网页问题:

方法2 :CreateObject(“WinHttp.WinHttpRequest.5.1”)
方法3:CreateObject(“msxml2.xmlhttp”)
方法4: CreateObject(“Msxml2.ServerXMLHTTP”)

后来发现是oDom在作怪,在oDom.body.innerHTML = .ResponseText数据转换时会发生。
解决方案:
不使用oDOM,使用正则表达式取值,假如我要取所有P标签的值,如下

Part = .responseText
 Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "<p.*>(.*?)</p>"
    're.Pattern = "p>.*[\s\S]*</p"
    re.Global = True
    re.IgnoreCase = False
    Set matchs = re.Execute(OrgStr)
   
    For Each m In matchs
        Debug.Print m.submatches(0) 
    Next
    

完结
如果你感觉还不够,请访问我一老哥的文章希望能帮到你 链接: VBA 网页提取特定内容 - 网抓实践总结.

  • 3
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: VBA是Visual Basic for Applications的简称,是一种用于编写宏和自定义函数的编程语言。在Excel中,可以借助VBA来抓取网页数据并将其存储在Excel中。 首先,在Excel中打开Visual Basic Editor,在“插入”菜单中选择“模块”,新建一个模块。 然后,编写VBA代码来抓取网页数据。首先,使用CreateObject函数创建一个XMLHttpRequest对象,该对象用于发送HTTP请求并获取网页内容。接下来,使用对象的Open方法指定HTTP请求的类型和URL地址。再使用Send方法发送HTTP请求,并通过ResponseText属性获取响应内容,将其保存为字符串。最后,使用Split函数将字符串解析为数组,并将数组中的数据逐行写入Excel。 以下是一个示例的VBA代码,用于抓取某网页的表格数据并将其存储在Excel中: ```VBA Sub 抓取网页数据到Excel() Dim xmlhttp As Object Dim html As Object Dim table As Object Dim row As Object Dim col As Object Dim i As Integer, j As Integer '创建XMLHttpRequest对象 Set xmlhttp = CreateObject("MSXML2.XMLHTTP") '发送HTTP请求 xmlhttp.Open "GET", "https://example.com", False xmlhttp.send '将获取的网页内容解析为HTML对象 Set html = CreateObject("htmlfile") html.body.innerHTML = xmlhttp.responseText '定位需要抓取的表格 Set table = html.getElementById("table_id") '逐行逐列抓取表格数据并写入Excel i = 1 For Each row In table.Rows j = 1 For Each col In row.Cells Cells(i, j) = col.innerText j = j + 1 Next col i = i + 1 Next row '释放对象 Set xmlhttp = Nothing Set html = Nothing Set table = Nothing Set row = Nothing Set col = Nothing End Sub ``` 以上代码仅为示例,实际使用时可能需要根据具体的网页结构和要抓取的数据进行修改。通过使用VBA脚本,可以自动抓取网页数据并将其快速整理到Excel中,提高工作效率。 ### 回答2: VBA是一种可以在Excel中编写的宏语言。通过使用VBA,我们可以编写程序来抓取网页数据并将其存储到Excel中。 要实现这个功能,首先需要了解VBA中的一些基本操作,如如何打开一个网页、如何获取网页源代码、如何解析网页内容等等。 当我们想要抓取网页数据时,可以使用VBA中的XMLHTTP对象打开一个网页,然后使用该对象的属性和方法来获取网页的源代码。通过分析源代码,我们可以确定我们所需要的数据在哪个标签中,然后使用VBA中的字符串处理函数来提取数据。 一旦我们获取了所需的数据,我们可以使用VBA中的Excel对象来创建一个新的工作表,并将数据填充到工作表的单元格中。 在编写VBA代码之前,我们需要在Excel中开启开发者选项,并插入一个新的VBA模块。然后,我们可以在模块中编写我们的抓取数据代码。 以下是一个简单的示例代码,演示如何使用VBA抓取网页数据到Excel中: ```vba Sub 抓取数据() Dim objHTTP As New XMLHTTP Dim htmlDoc As Object Dim tabelObj As Object Dim dataCell As Object Dim i As Integer '打开网页 objHTTP.Open "GET", "http://example.com", False objHTTP.send '创建HTML文档对象 Set htmlDoc = CreateObject("htmlfile") '将网页源代码加载到HTML文档对象中 htmlDoc.body.innerHTML = objHTTP.responseText '找到目标表格对象 Set tabelObj = htmlDoc.getElementById("table_id") '抓取每个单元格的内容并填充到Excel中 i = 1 For Each dataCell In tabelObj.getElementsByTagName("td") Cells(i, 1).Value = dataCell.innerText i = i + 1 Next dataCell '清理对象 Set objHTTP = Nothing Set htmlDoc = Nothing Set tabelObj = Nothing Set dataCell = Nothing End Sub ``` 以上就是一个简单的例子,演示了如何使用VBA抓取网页数据到Excel中。实际使用时,还需要根据具体需求进行相应的调整和优化。 ### 回答3: VBA是一种宏语言,可用于在Excel中自动执行各种任务。它既可以执行Excel内部操作,也可以与外部应用程序进行交互。VBA可以帮助我们抓取网页数据并将其导入到Excel表格中。 要使用VBA抓取网页数据到Excel,我们可以按照以下步骤进行操作: 1. 打开Excel,按下Alt + F11打开Visual Basic for Applications编辑器。 2. 在左侧的“项目资源管理器”窗格中,双击“这台工作簿”,然后在右侧的编辑窗格中输入VBA代码。 3. 首先,我们需要添加对“Microsoft Internet Controls”和“Microsoft HTML Object Library”的引用。选择“工具”菜单,然后选择“引用”,在弹出的对话框中勾选上述两个引用。 4. 创建一个新的宏,使用以下代码示例: Sub 抓取网页数据() Dim IE As Object Dim doc As Object Dim table As Object Dim rowNum As Integer ' 创建新的Internet Explorer对象 Set IE = CreateObject("InternetExplorer.Application") ' 打开要抓取数据网页 IE.Navigate "http://www.example.com" ' 等待页面加载完成 Do While IE.Busy Application.Wait DateAdd("s", 1, Now) Loop ' 获取页面的文档对象 Set doc = IE.Document ' 获取要抓取的表格对象 Set table = doc.getElementById("table_id") ' 遍历表格中的行,并将数据导入Excel rowNum = 1 For Each row In table.Rows For cellIndex = 1 To row.Cells.Length Cells(rowNum, cellIndex).Value = row.Cells(cellIndex).innerText Next cellIndex rowNum = rowNum + 1 Next row ' 关闭Internet Explorer对象 IE.Quit ' 释放对象的内存 Set table = Nothing Set doc = Nothing Set IE = Nothing End Sub 以上代码示例中,我们使用了Internet Explorer对象来加载并浏览要抓取数据网页。在完成页面加载后,我们通过获取页面的文档对象,然后使用getElementById方法获取到要抓取的表格对象。接下来,我们遍历表格中的每一行,并将每个单元格的文本值导入到Excel表中。 完成以上步骤后,点击运行按钮(或按下F5)执行VBA代码。程序将自动打开并加载指定网页上的表格数据,并将其导入到Excel中。 希望以上回答对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值