ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > 综合应用 > 网页信息提取的几种常见方法

网页信息提取的几种常见方法

作者:绿色风 分类: 时间:2022-08-17 浏览:145
楼主
嘉昆2011
声明:
1,文章素材参考ExcelHero Daniel Ferry 博客,对常用的网页信息提取方法进行比较和提炼,以适应中文信息的提取:
  1. http://www.excelhero.com/blog/2010/05/multi-threaded-vba.html
  1. http://www.excelhero.com/blog/2010/05/a-real-time-advanced-excel-chart.html
2,本文仅对各种方法作些初步比较,不对可视化的图表监控和面盘做深入讲解

涉及知识:
1,利用Internet Explorer提取表格等信息;
2,Excel内置宏录制提取信息;
3,利用MSXML2.XMLHTTP 内嵌式对象提取信息(包括“adodb.stream”,正则);
4,VBScript脚本借助VBA平台提取信息。

效果图:

 

利用柱型图+散点图制作模拟的进度观测条。图中灰色部分表示总共需要提取的记录数目;紫色部分表示已经发送出去的请求;蓝色部分代表已经获取的记录;红色线条代表获取当前记录所运行的速度(纵坐标所示)。

1,IE提取
在前文已经论述了IE提取的方法:
http://www.exceltip.net/thread-41437-1-1.html
  1. Sub IE_Method()
  2.         
  3.     Dim IE As New InternetExplorer
  4.     For i = 1 To Range("Code").Count
  5.     'IE.Visible = True
  6.     IE.navigate "http://www.cninfo.com.cn/information/fund/netvalue/" & Range("Code").Cells(i, 1) & ".html"
  7.     Do
  8.         DoEvents
  9.     Loop Until IE.readyState = READYSTATE_COMPLETE

  10.     Dim Doc As HTMLDocument
  11.     Set tb1 = IE.document.all.tags("table")(0)
  12.         Range("Name").Cells(i, 1) = Split(tb1.Rows(0).Cells(0).innerText, "£º")(2)
  13.     Set tb2 = IE.document.all.tags("table")(1)
  14.         Range("Date").Cells(i, 1) = tb2.Rows(1).Cells(0).innerText
  15.         Range("NetValue").Cells(i, 1) = tb2.Rows(1).Cells(1).innerText
  16.     Next
  17.     IE.Quit
  18.     Set IE = Nothing

  19. End Sub
特点及原理:IE作为比较原始的网页信息提取,语法相对简单,但运行缓慢;主要是由于IE本身巨大,更糟的是VBA处理需要同步等待从IE返回的信息,大量浪费用户时间。

2,Excel内置录宏
  1. Sub WebQuery_Method()

  2.     Dim QT As QueryTable
  3.     Dim StrConnect As String
  4.     For i = 1 To Range("Code").Count
  5.         For Each QT In Sheet2.QueryTables
  6.             QT.Delete
  7.         Next QT
  8.     StrConnect = "URL;http://www.cninfo.com.cn/information/fund/netvalue/" & Range("Code").Cells(i, 1) & ".html"
  9.     Set QT = Sheet2.QueryTables.Add(Connection:=StrConnect, Destination:=Sheet2.Range("K1"))
  10.     With QT
  11.         .BackgroundQuery = False
  12.         .AdjustColumnWidth = False
  13.         .RefreshPeriod = 0
  14.         .WebSelectionType = xlAllTables
  15.         .WebFormatting = xlWebFormattingNone
  16.         .Refresh BackgroundQuery:=False
  17.     End With
  18.    
  19.     Sheet1.Range("Name").Cells(i, 1) = Split(Sheet2.Range("WebTable").Cells(1, 1), "£º")(2)
  20.     Sheet1.Range("Date").Cells(i, 1) = Sheet2.Range("WebTable").Cells(4, 1) & " "
  21.     Sheet1.Range("NetValue").Cells(i, 1) = Sheet2.Range("WebTable").Cells(4, 2)
  22.     Sheet2.Range("WebTable").Clear
  23.     Next i
  24.       
  25. End Sub
特点与原理:通过录制宏的方式来提取网页信息,相对简单(改编代码相对较少),但对本文中的示例网站暂不推荐,运行速度与IE一样缓慢,有时会出现“假死”现象。

3,利用MSXML2.XMLHTTP 内嵌式对象提取信息(包括“adodb.stream”,正则)

 
  1. Sub XMLHTTP_Method()

  2.     Dim oXML As MSXML2.XMLHTTP
  3.     Set oXML = New MSXML2.XMLHTTP
  4.     For i = 1 To Range("Code").Count
  5.     oXML.Open "GET", "http://www.cninfo.com.cn/information/fund/netvalue/" & Range("Code").Cells(i, 1) & ".html", True
  6.     oXML.send
  7.     Do
  8.         DoEvents
  9.     Loop Until oXML.readyState = READYSTATE_COMPLETE
  10.    
  11.     ss = TransCode(oXML.responseBody, "gb2312")
  12.     Range("Name").Cells(i, 1) = Trim(Split(Split(ss, "</strong>")(2), "</td")(0))
  13.     Range("Date").Cells(i, 1) = RegExp(Split(Split(ss, "<td class=""zx_data"">")(2), "</td")(0), "\s|[a-z]|\&|\;") & " "
  14.     Range("NetValue").Cells(i, 1) = RegExp(Split(Split(ss, "<td class=""zx_data"">")(3), "</td")(0), "\s|[a-z]|\&|\;")
  15.     Next i
  16.     Set oXML = Nothing
  17.    
  18. End Sub
特点与原理:作为一种内嵌对象,打个不恰当的比方,仿佛如没有界面的网络浏览器(即,不可见),很很快检索网页文本放入内存,从这点上说,运行速度比前两种快很多。但是仍依赖于Excel,每次只能提取一条记录;而且速度不是很稳定,时高时低。然很多中文网站的字符编码是gb2312,如本例。由于XMLHTTP默认识别的编码是UTF-8,因此直接从.responseText对象得到的字符串会发现其中的汉字为乱码。需要借助Adodb.Stream对象提取字符串,可以参考链接:
  1. http://club.excelhome.net/thread-893760-1-1.html
http://www.exceltip.net/forum.php?mod=viewthread&tid=16447 二楼
随后将得到的字符串经过简单的正则处理,即可得到所需信息。
  1. Function TransCode(StrBody, Cset)
  2.     With CreateObject("adodb.stream")
  3.         .Type = 1
  4.         .Mode = 3
  5.         .Open
  6.         .Write StrBody
  7.         .Position = 0
  8.         .Type = 2
  9.         .Charset = Cset
  10.         TransCode = .ReadText
  11.         .Close
  12.      End With
  13. End Function

  14. Function RegExp(StrExp, RegRul)
  15.     With CreateObject("vbscript.regexp")
  16.         .Global = True
  17.         .Pattern = RegRul
  18.         RegExp = .Replace(StrExp, "")
  19.     End With
  20. End Function
4,VBScript脚本借助VBA平台提取信息
  1. Sub Swarm_Method()
  2.     Dim Rng As Range
  3.     Dim lngAgent As Long
  4.         For i = 1 To Range("Code").Count
  5.             Set Rng = Range("Name").Cells(i, 1)
  6.             CreatVBScriptAgent Rng
  7.             lngAgent = lngAgent + 1
  8.             If lngAgent = [SwarmSize] Then lngAgent = 0
  9.         Next i
  10.     Set Rng = Nothing
  11. End Sub

  12. Public Sub CreatVBScriptAgent(Rng As Range)
  13. Dim sFileName As String
  14. Dim intFileNum As Integer
  15. Dim shellWin As New ShellWindows
  16. Dim S As String, sCode As String, sRecord As String
  17. Dim k As Long

  18. sRecord = Rng.Resize(, 3).Address
  19. sCode = Rng.Offset(, -1)
  20. k = Rng.Row Mod [SwarmSize]
  21. Rng = "Agent_" & k

  22. S = S & "Dim oXL, oXML, cRec, ss, Results(2)" & vbCrLf
  23. S = S & "cRec=""" & sCode & """" & vbCrLf
  24. S = S & "Set oXL = GetObject(, ""Excel.Application"") " & vbCrLf
  25. S = S & "Set oXML = WScript.CreateObject(""MSXML2.XMLHTTP"") " & vbCrLf
  26. S = S & vbCrLf
  27. S = S & vbCrLf
  28. S = S & "oXML.Open ""GET"", ""http://www.cninfo.com.cn/information/fund/netvalue/"" & cRec & "".html"", False" & vbCrLf
  29. 'S = S & "Wscript.Sleep 50 " & vbCrLf
  30. S = S & "oXML.Send" & vbCrLf
  31. 'S = S & "Wscript.Sleep 50 " & vbCrLf
  32. S = S & vbCrLf
  33. S = S & vbCrLf
  34. S = S & "ss = TransCode(oXML.responseBody, ""gb2312"")" & vbCrLf
  35. S = S & "Results(0) = Trim(Split(Split(ss, ""</strong>"")(2), ""</td"")(0))" & vbCrLf
  36. S = S & "Results(1) = RegExp(Split(Split(ss, ""<td class=""""zx_data"""">"")(2), ""</td"")(0), ""\s|[a-z]|\&|\;"") & ""  """ & vbCrLf
  37. S = S & "Results(2) = RegExp(Split(Split(ss, ""<td class=""""zx_data"""">"")(3), ""</td"")(0), ""\s|[a-z]|\&|\;"")" & vbCrLf
  38. S = S & "Wscript.Sleep 50" & vbCrLf
  39. S = S & "oXL.Workbooks(""" & ThisWorkbook.Name & """).Sheets(""Interface"").Range(""" & sRecord & """) = Results" & vbCrLf
  40. S = S & vbCrLf
  41. S = S & vbCrLf
  42. S = S & "Function TransCode(StrBody, Cset)" & vbCrLf
  43. S = S & "    With WScript.CreateObject(""adodb.stream"")" & vbCrLf
  44. S = S & "        .Type = 1" & vbCrLf
  45. S = S & "        .Mode = 3" & vbCrLf
  46. S = S & "        .Open" & vbCrLf
  47. S = S & "        .Write StrBody" & vbCrLf
  48. S = S & "        .Position = 0" & vbCrLf
  49. S = S & "        .Type = 2" & vbCrLf
  50. S = S & "        .Charset = Cset" & vbCrLf
  51. S = S & "        TransCode = .ReadText" & vbCrLf
  52. S = S & "        .Close" & vbCrLf
  53. S = S & "     End With    " & vbCrLf
  54. S = S & "End Function" & vbCrLf
  55. S = S & vbCrLf
  56. S = S & vbCrLf
  57. S = S & "Function RegExp(StrExp, RegRul)" & vbCrLf
  58. S = S & "    With WScript.CreateObject(""vbscript.regexp"")" & vbCrLf
  59. S = S & "        .Global = True" & vbCrLf
  60. S = S & "        .Pattern = RegRul" & vbCrLf
  61. S = S & "        RegExp = .Replace(StrExp, """")" & vbCrLf
  62. S = S & "    End With   " & vbCrLf
  63. S = S & "End Function" & vbCrLf
  64.    
  65. sFileName = ActiveWorkbook.Path & "\SwarmAgent_" & k & ".vbs"
  66. intFileNum = FreeFile
  67. Open sFileName For Output As intFileNum
  68. Print #intFileNum, S
  69. Close intFileNum

  70. Set wshShell = CreateObject("Wscript.Shell")
  71. wshShell.Run """" & sFileName & """"

  72. Set wshShell = Nothing
  73.      
  74. End Sub
特点与原理:VBScript借助VBA平台运行,速度快而稳定,但是需要相对扎实的基本功和代码调试技巧。同时也依赖这几个因素:1,所选曲的网站;2,运行的操作系统(XP系统上只可以运行几个“蜂包”,而Vista却可以运行几十个--原文作者测试)Win7可以运行更多,但达到一定程度后,速度稳定,不会随“蜂包”的增加而加快。每个“蜂包”都有它的使命:到达目标网站,获取记录,写入Excel,消失;周而复始。

最后,不要干坏事。。。

附件:

VBAWEB.rar


2楼
0Mouse
很棒的总结!强烈支持!收藏学习!
3楼
lrlxxqxa
单击getdata按钮后,弹出很多提示,关闭时连续出现第一个提示,多次单击确定后才关闭。桌面出现很多文件。

 
生成在桌面的文件.rar
4楼
嘉昆2011
谢谢支持
5楼
嘉昆2011
原文作者说Vista可能会有Bug。但俺这里测试Win7是正常的。另外,您附件就是自动生成的VBScript文件啊。
6楼
lrlxxqxa
我的是xp系统

 
7楼
liucq
值得借鉴,有能力的话,改成XMLHTTP并发、异步模式或更好
8楼
嘉昆2011
俺用Win7 + Excel 2010调试过程中没有遇到这样的问题。知道如何解决的朋友请分享下经验。
9楼
猴子
  Dim IE As New InternetExplorer
   Dim Doc As HTMLDocument

  Dim QT As QueryTable
  Dim oXML As MSXML2.XMLHTTP
老板为什么我测试这4种方法的时候总是出现以上这几句“用户定义类型未定义”,没办法测试啊、、、





10楼
嘉昆2011
运行过程出错?麻烦截个图看看。另外,系统和Excel版本是什么?
11楼
猴子
是我没有引用的原因
12楼
keven
赞一个!
13楼
doron
无敌学习
14楼
lvbin2ooo
感谢分享啊

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap