English
 电子信箱
 加入收藏

  威盾防火墙 >> 新闻中心 >> 威盾新闻 >> 用XMLHTTP获取数据并用Adodb.Stream转换编码提取信息

 

用XMLHTTP获取数据并用Adodb.Stream转换编码提取信息

威盾防火墙 2014-11-18

 
初学者学习网页采集要经历的几大难关:
1、如何找到抓取的数据所在的网页链接---用httpfox或者fiddler2
2、如何得到数据-------------------------------用Microsoft.XMLHTTP、Msxml2.XMLHTTP、MSXML2.ServerXMLHTTP、WinHttp.WinHttpRequest.5.1对象
3、如何转换编码-------------------------------用Adodb.Stream对象
4、如何得到最终需要的数据-----------------vba字符串处理的基本功(字符串和数组处理,split、replace、filter、正则等)

下面看一个简单的网页采集例子
  1. Sub test()
  2.     Dim strRespText$, tt$, i&, DW$
  3.     Dim URL
  4.     URL = "******************************"          '链接请看楼顶说明里的帖子,俺这里就不写了,以免被防水墙删贴
  5.     With CreateObject("Microsoft.XMLHTTP")
  6.         .Open "GET", URL, False                     '要抓取的链接,"GET"尽量用大写,以免某些系统不兼容
  7.         .Send
  8.         tt = .responsetext
  9.         With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")    'DataObject对象,数据放入剪贴板,记事本观察数据
  10.             .SetText tt                                                    '因为XMLHTTP默认是UTF-8,不能识别gb2312,会发现数据乱码
  11.             .PutInClipboard                                                '所以不能采用.responsetext对象来得到字符串
  12.         End With
  13.         tt = BytesToBstr(.ResponseBody, "GB2312")                          '因此要用Adodb.Stream对象
  14.         'tt = StrConv(.ResponseBody, vbUnicode,&H804)                     '或者StrConv函数,从.ResponseBody得到字符串
  15.         'tt = StrConv(.ResponseBody, vbUnicode)                            '因网页为GB2312,简体版的操作系统也可以不写第三个参数
  16.         With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")    '得到的字符串放入剪贴板,记事本观察数据
  17.             .SetText tt                                                    '数据正常显示,可以提取了
  18.             .PutInClipboard
  19.         End With
  20.         tt = Replace(tt, vbCrLf, "")                                       '清理要提取的数据,准备提取
  21.         tt = Replace(tt, "</font></b></td>                  <td width=""392""><font size=""2"">", "")
  22.         DW = Split(Split(tt, "报考单位:")(1), "<")(0)                     '提取数据
  23.         MsgBox DW
  24.     End With
  25. End Sub
复制代码
下面是采集用到的Bstr编码转换函数
  1. Function BytesToBstr(strBody, CodeBase)         '使用Adodb.Stream对象提取字符串
  2.     Dim objStream
  3.     On Error Resume Next
  4.     Set objStream = CreateObject("Adodb.Stream")
  5.     With objStream
  6.         .Type = 1                               '二进制
  7.         .Mode = 3                               '读写
  8.         .Open
  9.         .Write strBody                          '二进制数组写入Adodb.Stream对象内部
  10.         .Position = 0                           '位置起始为0
  11.         .Type = 2                               '字符串
  12.         .Charset = CodeBase                     '数据的编码格式
  13.         BytesToBstr = .ReadText                 '得到字符串
  14.     End With
  15.     objStream.Close
  16.     Set objStream = Nothing
  17.     If Err.Number <> 0 Then BytesToBstr = ""
  18.     On Error GoTo 0
  19. End Function

相关内容: 最新内容:
如何伪造Cookie及处理Referer防盗链[2014-11-18]
当网站遭遇DDOS攻击的解决方案及展望[2014-11-18]
提高Discuz防DDOS能力的方法和代码[2014-11-18]
比DDoS更变态的防御CC攻击安全技术解析[2014-11-18]
Apache 防盗链(Apache Anti-Leech)技术的简单实现[2014-11-18]
Apache 实现禁止图片盗链[2014-11-18]