vba 在网页中抓取指定内容

用vba程序从网页里抓取想要的内容,如下代码可抓取autopiano.cn网站上的所有曲谱和歌词:

Private Sub MacraGrabTunes()
Dim iBegin, iEnd, iRow As Integer
Dim t0, t1 As Single
Dim Sign1, Sign2 As String
Dim strHtml, strTitle, strTune As String
Dim Web1 As Object
Set Web1 = CreateObject("Msxml2.ServerXMLHTTP.3.0")
Application.ScreenUpdating = False
t0 = Timer
For i = 1 To 5000
    strURL = "https://www.autopiano.cn/post/" & i
    Web1.Open "GET", strURL, False
    On Error Resume Next
    Web1.Send
    strHtml = Web1.responseText
    If Err < 0 Then
        strHtml = "检测网址找不到或没返回信息!"
        MsgBox strHtml
    Else
        Sign1 = "<div class=""section-content"">"
        iBegin = InStr(strHtml, Sign1)
        If iBegin < 1 Then
            strHtml = "没找到歌谱"
        Else
            Sign1 = "<title>"
            Sign2 = "- 自由钢琴"
            iBegin = InStr(strHtml, Sign1)
            iEnd = InStr(strHtml, Sign2)
            strTitle = Mid(strHtml, iBegin + Len(Sign1), iEnd - iBegin - Len(Sign1) - 1)
            
            Sign1 = "<div class=""section-content"">"
            iBegin = InStr(strHtml, Sign1)
            strHtml = Mid(strHtml, iBegin - 1, Len(strHtml))
            
            Sign2 = "</div>"
            iBegin = InStr(strHtml, Sign1)
            iEnd = InStr(strHtml, Sign2)
            strTune = Mid(strHtml, iBegin + Len(Sign1) + 1, iEnd - iBegin - Len(Sign1) - 1)
            
            Sign1 = "<div class=""section lyric-section"">"
            iBegin = InStr(strHtml, Sign1)
            If iBegin > 0 Then
                strHtml = Mid(strHtml, iBegin - 1, Len(strHtml))
            
                Sign1 = "<div class=""section-content"">"
                iBegin = InStr(strHtml, Sign1)
                iEnd = InStr(strHtml, Sign2)
                strHtml = Mid(strHtml, iBegin + Len(Sign1) + 1, iEnd - iBegin - Len(Sign1) - 1)
            Else
                strHtml = "-NULL-"
            End If
            If Len(strHtml) < 4 Then strHtml = "-NULL-"
            
            iRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
            If iRow < 5 Then iRow = 5
            
            Cells(iRow, 1) = i
            Cells(iRow, 2) = strTitle
            Cells(iRow, 3) = strTune
            Cells(iRow, 4) = strHtml
            
            t1 = Timer
            Do
                DoEvents
            Loop While Timer - t1 < 0.02
        End If
    End If
Next

Cells.Replace What:="<p>=", Replacement:="'=", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="<p>", Replacement:="", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="</p>", Replacement:="", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
Cells.Replace What:="<br />", Replacement:="", LookAt:=xlPart, SearchOrder _
        :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

Application.ScreenUpdating = True
t1 = Timer
MsgBox "结束,用时:" & t1 - t0

End Sub

点此下载已抓取曲谱和歌词,.xlsm文件包含源代码。

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答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。 希望以上回答对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hann Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值