vba xmlhttp 抓取网页(网页数据下载与控制(网页控制)())

优采云 发布时间: 2021-11-09 18:09

  vba xmlhttp 抓取网页(网页数据下载与控制(网页控制)())

  网页数据下载与控制

  一、概述和感谢

  网页控制需要用到的方面可以大致总结如下:

  1、 程序中需要嵌入一个网页,比如天气预报。

  2、 需要从网上下载数据写入本地数据库。

  二、傲游的使用

  不管什么应用,第一件事就是找到网址(可能是废话)。

  以Winland的天气预报为例。如果我的程序需要这样的东西,我该怎么做:

  1、打开

  2、点击“天气预报”打开:/tianqi

  3、 尝试查看一个城市,此时找到了结果,但是URL并没有改变。

  4、点击Maxthon的viewpage。

  5、在“Frame”中,找到一个“Inline Frame”,点击打开。原来天气预报的网址是:

  /WeatherInfoIfm.aspx?CityName=%e5%ae%9c%e6%98%8c

  6、接下来我们就可以在自己的程序中使用这个URL直接查询了。

  综上所述,通过傲游,我们可以轻松找到自己需要的真实网站。

  viewpage里面还有一个“form”,里面清楚的显示了Name、method和Action。我知道这个 Action 是“结果页面”的 URL 的后半部分(对吗?)。

  (在网页形式中,Action为目标地址,即对提交内容进行处理的服务器端脚本,如果Action为空,则为当前文件。)

  三、 网页关键词解读(输入、按钮、数据)

  ASP 脚本片段的开始和结束。标签之间的脚本代码将在主页传递到用户浏览器之前在服务器上执行。

  并标记网页的开头,标记网页的结尾。

  并且网页上的文字应该放在这些标记之间

  以及表的开头和结尾

  表格边框参数指定表格边框的宽度

  并将表格标题放在这些标签之间

  和

  标记表中新行的开始。表中的每一行都以

  标记结束。

  和

  使用这些标签来标识表格单元格。每个单元格以

  马克开头

  标记结束。表格单元格可以收录任何内容,包括另一个表格。

  我们需要关注的是:和,和

  也

  和

  .

  文本框:有些省略TYPE、VALUE和SIZE,但应该有关键字INPUT和NAME。

  选择框:

  单选按钮:升序'当前选择

  降序

  多选按钮:

  '当前选择

  五菱LZW6400CV3客车(批次#F9)

  中顺SZS6503E1轻型客车(批次#F9)

  按下按键:

  名称=获取事件>

  四、POST、GET 和 NAME、VALUE

  为了从网页中获取数据,参数需要明确。要在 Web 查询中将参数发送到 Web 服务器,您需要在验证特定 Web 服务器使用哪种方法后使用 POST 或 GET 方法。

  打开源代码并搜索“POST”。如果使用 POST 方法向 Web 服务器发送参数,则应显示文本 POST。如果Web服务器使用GET方式接收参数,可以在浏览器地址栏中看到参数名称和值。例如:/dist_sch/sch/searchresult/asp?boro=Manhattan &flag= schoolInfo2

  (第一个参数前面加一个问号,参数之间用与号隔开,参数顺序不重要)

  搜索“名称”。在单词名称之后,可以看到括号中的一些文字,这是第一个参数的名称。在“value=”这个词之后,是参数的当前值。例如:

  在上面的 HTML 语句中,“Amount”这个词是参数名称,“1”是参数的当前值。参数值也可以是 HTML 标签中的选项之一。例如:

  Post和Get的区别:

  1、Get用于从服务器获取数据,Post用于向服务器传输数据。

  2、Get将表单中的数据以variable=value的形式添加到action指向的URL中,两者用“?”连接,变量用“&”连接;Post是将表单中的数据放在表单的数据体中,以变量和值对应的方式传递给action指向的URL。

  3、Get 是不安全的,因为在传输过程中,数据是放在请求的 URL 中的,很多现有的服务器、代理服务器或者用户代理都会将请求的 URL 记录在日志文件中,然后放入日志文件。在某个地方,一些隐私信息可能会被第三方看到。此外,用户还可以直接在浏览器上看到提交的数据,一些内部系统消息会显示在用户面前。Post的所有操作对用户都是不可见的。

  4、Get传输的数据量很小。这主要是由于URL长度的限制,只能传输1024字节左右;而Post可以传输大量数据,最大2M,所以上传文件时只能使用Post。

  5、Get 限制Form的数据集的值为ASCII字符;和 Post 支持整个 ISO10646 字符集。

  6、Get 是 Form 的默认方法。

  五、使用网页浏览器

  要使用 WebBrowser,您需要添加“Microsoft Web 浏览器”(VBA) 或“Microsoft Internet 控件”(VB)。

  1、WebBrowser的简单使用方法:

  '开店前

  Urlstr=" /WeatherInfoIfm.aspx?CityName=%e5%ae%9c%e6%98%8c"

  F_tqyb.WebBrowser1.导航Urlstr

  F_tqyb.Show'当这句话被屏蔽时,WebBrowser也打开了网页,但在桌面上不显示

  Private Sub WebBrowser1_StatusTextChange(ByVal Text As String)

  如果 WebBrowser1.ReadyState READYSTATE_COMPLETE Then Exit Sub'页面调用是否完成...

  结束子

  2、我们想要的网页内容:

  一般来说,我们想要的网页内容在WebBrowser1.document.body.innerhtml 和WebBrowser1.document.body.innertext 中,通过替换和分析,可以得到我们想要的数据。

  Innerhtml 中的内容是网页的源代码。

  innertext 中的内容是网页上显示的内容。(此内容是我们将网页保存为文本时的内容) 个人认为使用Innerhtml更方便。

  当您拥有 html 源代码时,您可以使用搜索和替换功能来删除您需要的数据。另外,可以将源代码写入文本文件,将文本文件的扩展名修改为htm,然后使用Excel的“导入外部数据”-“导入数据”功能将数据读入Excel。(通过这个方法,导入时选择具体的表,可以参考需要导入的表号WebTables)

  3、在程序中使用WebBrowser显示网页

  ⑴. 如果您需要的网页的 URL 收录怎么办?,而且取值规则很明确,很方便,直接把参数和取值写到URL中即可,如上例(显示宜昌天气),只需注意:第一个参数前面是一个问号,参数用与号分隔。参数的顺序并不重要。

  如果该值收录非英文和数字,则需要进行转换。(应用Winland的程序)

  示例:City=Escape("宜昌")

  公共函数转义(ByVal strText As String)作为字符串

  Dim JS 作为 ScriptControl

  设置 JS = 新建 MSScriptControl.ScriptControl

  nguage = "JavaScript"

  Escape = JS.Eval("encodeURI('" & Replace(strText, "'", "\'") & "');")

  结束函数

  ⑵. 如果您需要的网页的 URL 收录怎么办?,但价值规则不明确。例如,如果将其替换为一长串值,则需要从上层开始。我们估计并称之为“查询网页”和“结果网页”。

  通过程序分析“查询网页”,自动进入、选择、点击,或用户在使用时输入、选择、点击,打开“结果网页”。

  但是此时出现了一个问题:“结果网页”在新窗口中打开,在WebBrowser1中没有显示!这一刻,

  我们从以下方法中找到适合自己的:(详情见下文)

  ①、“遍历打开的IE窗口”,找到“结果网页”,读取网页,关闭网页,用EXCEL的“获取外部数据”将网页内容读入EXCEL。

  ②、“遍历打开的IE窗口”,找到“结果网页”的hwnd(句柄),设置为current,然后模拟鼠标点击,然后sendkey:全选,复制,关闭网页,最后粘贴进去优秀。

  ③、“遍历打开的IE窗口”,找到“结果网页”,恢复对IE的控制,读取innerhtml,分析innerhtml。

  ④. 强制在 WebBrowser1 中显示新窗口,而无需打开 IE 或 Maxthon。阅读innerhtml并分析innerhtml。

  ⑤使用POST方式(winland提供)。

  ⑥. 使用EXCEL 的POST 方法。

  ⑶. 如果您需要的网址不包括在内怎么办?, 无论您的查询条件是什么,“结果页”的网址都保持不变。这时候如果直接在IE中输入地址,就什么也得不到。对于此类网页,只能从上层查看,同上。

  (我刚完成的程序属于这一类,用winland提供的POST方法不行,最后用EXCEL的POST方法完成)

  六、使用IE

  1、如果不想用WebBrowser,想用IE浏览器,或者“结果网页”是新窗口,被“强制”使用,控制起来也比较方便。

  将 IEPL 调暗为对象

  Set IEPL = CreateObject("InternetExplorer.Application")

  IEPL.Visible = False'Hide

  '打开网页

  URLstr=""

  IEPL.Navigate URLstr

  '和 webbrowser 一样,当页面被调用时,DocumentComplete 事件就会发生。

  '读取内部html

  ...

  IEPL.退出关闭

  或者:

  Shell ("C:\Program Files\Internet Explorer\IEXPLORE.exe about:blank")

  遍历打开的IE窗口,通过窗口标题找到刚刚打开的IE(或“结果页”的新窗口),恢复对IE的控制。

  '遍历打开的IE窗口

  Dim dWinFolder 作为新的 ShellWindows

  Dim objIE 作为对象

  Dim Czpmxurl As String, Czpmxname As String

  对于 dWinFolder 中的每个 objIE

  Czpmxname = objIE.LocationName'Title

  If InStr(Czpmxname, "Query Results") Then

  Zdurl = 真

  万一

  下一个

  如果 Zdurl then'found

  objIE.application.Visible = False'隐藏

  czpmxurl = objIE.LocationURL'URL

  '读取内部html

  ...

  万一

  objIE.application.Quit'Close

  2、如果“结果网页”的新窗口不是IE,而是傲游,会比较麻烦。上述隐藏和关闭方法对傲游无效且无错误,但其他控制方法相同。此时要关闭傲游,必须使用sendkey Alt+F4 方法。

  当然,您也可以通过修改注册表将IE设置为默认。

  七、查询结果是新建弹窗的控件

  当查询结果是新的弹窗时,IE控件前面已经讨论过了,这里有两种方法:

  1、示例:通过窗口标题找到“结果网页”的hwnd(句柄),设置为current,然后模拟鼠标点击,然后sendkey:全选,复制,关闭网页,最后粘贴在 EXCEL 中。

  '定义API函数

  声明函数 FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

  声明 Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

  声明函数 SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

  声明函数 ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long

  类型 POINTAPI

  x只要

  y 只要

  结束类型

  声明函数 GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

  公共常量 SM_CXSCREEN = 0

  公共常量 SM_CYSCREEN = 1

  声明 Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

  Public Const MOUSEEVENTF_MOVE = &H1 '鼠标移动

  Public Const MOUSEEVENTF_LEFTDOWN = &H2 '左键按下

  Public Const MOUSEEVENTF_LEFTUP = &H4 '左键向上

  Public Const MOUSEEVENTF_RIGHTDOWN = &H8 '右键按下

  Public Const MOUSEEVENTF_RIGHTUP = &H10 '右键向上

  Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 '中键按下

  Public Const MOUSEEVENTF_MIDDLEUP = &H40 '中间按钮向上

  Public Const MOUSEEVENTF_ABSOLUTE = &H8000 '绝对移动

  '定义

  Dim Czpmxhwnd 只要

  czpmxhwnd = FindWindow(vbNullString, "-Query result-Microsoft Internet Explorer")'根据窗口标题搜索,找到时返回句柄

  If Czpmxhwnd = 0 Then Czpmxhwnd = FindWindow(vbNullString, "Query Results-Microsoft Internet Explorer")

  如果 Czpmxhwnd = 0 那么

  MsgBox "未找到", vbOKOnly, "提示"

  退出子

  万一

  aa = SetForegroundWindow(Czpmxhwnd)'将网页置于前台

  睡眠 100

  mouse_event MOUSEEVENTF_RIGHTDOWN 或 MOUSEEVENTF_RIGHTUP, 0&, 0&, 0, 0' 模拟鼠标点击,设置焦点

  睡眠 100

  SendKeys "^a", True'Ctrl+A 全选

  睡眠 100

  SendKeys "^c", True'Ctrl+C 复制

  睡眠 100

  SendKeys "%{F4}", True'Alt+F4 关闭

  '打开EXCEL,粘贴

  ...

  2、强制在WebBrowser1中显示新窗口,无需打开IE或Maxthon

  使用这种方法,无论是通过程序“自动点击”“提交”按钮,还是用户点击“提交”按钮,新窗口都被强制显示在WebBrowser1中,无需打开IE或Maxthon。

  从 1 创建一个新窗口,并在窗口中放置一个 WebBrowser1。

  私有子 Form_Load()

  Dim Strurl 作为字符串

  Strurl="……"'网址

  WebBrowser1.导航strurl

  结束子

  Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)

  '当有新的弹出窗口时触发

  将新窗口调暗为 Form1

  设置 NewWindow = New Form1

  新窗口.显示

  设置 ppDisp = NewWindow.WebBrowser1.Object

  '上面VBA中的命令错误需要改成:

  '设置 ppDisp = NewWindow.WebBrowser1

  结束子

  Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)

  '网页下载'时触发

  Dim I As Single, J As Single

  如果WebBrowser1.ReadyState READYSTATE_COMPLETE Then Exit Sub'Open all web pages' 根据窗口标题或其他属性,判断是完成“查询网页”还是“结果网页”

  '根据不同的需求,编写相应的命令

  ...

  结束子

  八、使用POST方式(winland提供)

  要使用这种方法,首先必须根据“查询页面”中的内容编写要提交的查询字符串。当然,如果有非英文和数字,还必须使用上面的转义函数进行转换。

  strQuery="year_start=%202007&month_start=%205&date_start=%2012&" & _

  "hour_start=%200" & _

  "&year_end=%202007&month_end=%205&date_end=%2013&hour_end=%200" & _

  "&substation%5B%5D=00&R1=sortall&order=1&desckey="

  '上句表示开始年月日为:2007-5-12 0:00(%20为空格),结束时间:2007-5-13 0:00,单位为00( %5B%5D 为 []),所有内容,升序,无关键字。

  '没有“提交”按钮内容

  调用 QueryStr(strQuery)

  Public Sub QueryStr(strQuery As String)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线