ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2563|回复: 7

[求助] winhttp 网页抓取,window.onload 接收信息不完整。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-5-14 16:43 | 显示全部楼层 |阅读模式
求助,通过学习论坛中的网页抓取,给我的工作带来了很大帮助,但近几天有个网页,一直无法提取。现象如下:
1、通过IE可以正常浏览到数据29232字节,但通过VBA 只能提取到688字节
ie浏览器通过fiddler4 的回应报文如下:后面还有很多,没有全部粘贴
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<div id="slloading" style="font-size:12px;">正在查询中...</div>
<!--
loadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloading
loadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloading
loadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloading
-->
<script language="JavaScript">
function delloading(){
document.all["slloading"].outerHTML="";
}
window.onload=delloading;
</script>

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=GBK">
    <link rel="stylesheet" type="text/css" href="/css/bims.css">
    <title>XXXXXXXXXX</title>
</head>
<body style="padding:10px;">
<table border="0" style="width:100%;">
    <tr>
        <td colspan="29"><b>XXXXXXXX</b></td>
    </tr>
    <tr>
        <td colspan="2">
            <table class="tableform" border="0" cellpadding="0" cellspacing="0" style="width:100%;">
                <tr>
                    <td>
                        <table class="tableform" border="0" cellpadding="4" cellspacing="1" style="width:100%;">
                            <tr>
                                <td colspan="5">
                                    <table height="20" style="width:100%;">
                                        <tr>
                                            <td>总条数:8301条
                                            </td>
                                            <td>
                                                1&nbsp;<a class='page_a_link' href='query_user_info_computer_e.jsp?


2、通过vba ,fiddler4 回应
0296
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<div id="slloading" style="font-size:12px;">正在查询中...</div>
<!--
loadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloading
loadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloading
loadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloading
-->
<script language="JavaScript">
function delloading(){
document.all["slloading"].outerHTML="";
}
window.onload=delloading;
</script>
0002

0000
3、VBA查看响应报文如下:
HTTP/1.1 200 OK
Connection: close
Date: Thu, 14 May 2015 08:38:21 GMT
Transfer-Encoding: chunked
Content-Type: text/html;charset=GBK
X-Powered-By: Servlet/2.5 JSP/2.1


各位大侠,请帮助一下。谢谢。



TA的精华主题

TA的得分主题

发表于 2015-5-14 18:17 | 显示全部楼层
你用fiddler看看数据在哪,有些数据不在一个链接里面

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-15 15:39 | 显示全部楼层
liucqa 发表于 2015-5-14 18:17
你用fiddler看看数据在哪,有些数据不在一个链接里面

我用FIDDLER 抓包,相关的信息就在这个页面下面,我对html 代码不是特别懂,我理解是用浏览器进行加载时,使用函数window.onload 加载分包接入到 的信息(返回的包是transfer-encoding:chunked)的包。winhttp 接受到包含js代码的包是否自动运行呀?

TA的精华主题

TA的得分主题

发表于 2015-5-15 16:38 | 显示全部楼层
cmcboy 发表于 2015-5-15 15:39
我用FIDDLER 抓包,相关的信息就在这个页面下面,我对html 代码不是特别懂,我理解是用浏览器进行加载时, ...

看textview

TA的精华主题

TA的得分主题

发表于 2015-5-15 16:59 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-15 18:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
liucqa 发表于 2015-5-15 16:38
看textview

看fiddler 中的textview 显示如下。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">









<div id="slloading" style="font-size:12px;">正在查询中...</div>
<!--
loadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloading
loadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloading
loadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloadingloading
-->
<script language="JavaScript">
function delloading(){
        document.all["slloading"].outerHTML="";
}
window.onload=delloading;
</script>

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-15 18:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
VBA万岁 发表于 2015-5-15 16:59
方便上传你的代码码?
  1. Sub 添加新的端口()

  2. Dim objwinhttp As Object
  3. Dim objxmlhttp As Object

  4. Dim doc As MSHTML.HTMLDocument
  5.   Dim aar() As String
  6. Dim filter As String
  7. Dim fileToOpen
  8. Dim URL As String
  9. Dim userhd() As String
  10. Dim newdslamid As String
  11. Dim Regex As Object
  12. Set Regex = CreateObject("VBScript.RegExp")
  13. Dim matchs As Object, match As Object
  14. Dim x As String

  15. Set objwinhttp = CreateObject("WinHttp.WinHttpRequest.5.1")
  16. Set objxmlhttp = CreateObject("Msxml2.ServerXMLHTTP.6.0")

  17. mname = ActiveWorkbook.Name
  18. UserName = Sheets("main").Cells(2, 2)
  19. pass = Sheets("main").Cells(3, 2)
  20. bname = Sheets("main").Cells(5, 2)
  21. ds = Sheets("main").Cells(9, 2)

  22. accept = "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"
  23. useragent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; Tablet PC 2.0)"
  24. contype = "application/x-www-form-urlencoded"
  25. alive = "Keep -Alive"
  26. leg = 24
  27. URL = "http://xxx.xxx.xxx.xxx:9009"
  28. referer = "http://xxx.xxx.xxx.xxx:9009/login.jsp"
  29. Call firstgetData(objwinhttp, URL)

  30. If objstatus <> "200" Then
  31. End
  32. End If

  33. URL = "http://xxx.xxx.xxx.xxx:9009/auth.jsp"
  34. referer = "http://xxx.xxx.xxx.xxx:9009/login.jsp"

  35. data = "login=" & UserName & "&passwd=" & pass
  36. leg = Len(data)
  37. Call postData(objwinhttp, URL)

  38.   If objstatus <> "302" Then
  39. End
  40. End If
  41. URL = "http://xxx.xxx.xxx.xxx:9009/new_left.jsp?topid=40"
  42. referer = "http://xxx.xxx.xxx.xxx:9009/new_top.jsp"
  43. leg = 0

  44. Call getData(objwinhttp, URL)
  45.   If objstatus <> "200" Then
  46. End
  47. End If
  48.   
  49. newusername = Sheets("edit").Cells(2, 2)
  50. URL = "http://xxx.xxx.xxx.xxx:9009/4/query_user_info_computer_e.jsp?userid=&loginname=" & newusername & "bindingphone=&usertype=&username=&branch=&state=&isbinding=&realport=&atu_c=&vp=&vc=&switch=&su=&ip=&equipsource=&discnt=&ratiotype=&displaycon=userid%7Eusername%7Estate%7Ebranch%7Eisbinding%7Eatu_c%7Eusertype%7Esplitter%7Eswitch%7Edslamip%7Edslamid%7E"

  51. referer = "http://xxx.xxx.xxx.xxx:9009/4/query_user_info_computer_e_toolbar.jsp"

  52. Call getDataxml(objxmlhttp, URL)
  53.   
  54. Sheets("temp").Cells(1, 1) = getrptext

  55. 以下省略
  56. Private Sub firstgetData(objwinhttp As Object, URL As String)
  57.     With objwinhttp
  58.         .Option(6) = False                                          '不重定向
  59.         .Open "get", URL, False                                    '获取第一个动态的POST参数,一般是用GET提交得到,这一点通过抓包软件可以确认
  60.         .setRequestHeader "Connection", "Keep-Alive"
  61.         .send
  62.         .WaitForResponse
  63.         getrptext = .responseText
  64.         Cookie = .getResponseHeader("Set-Cookie")
  65.         Cookie = Split(Cookie, ";")(0)
  66.   
  67.         objstatus = .Status
  68.         
  69.       
  70.    
  71.     End With

  72. End Sub

  73. Private Sub getData(objwinhttp As Object, URL As String)
  74.      With objwinhttp
  75.         .Option(6) = False                                          '不重定向
  76.         .Open "get", URL, False                                    '获取第一个动态的POST参数,一般是用GET提交得到,这一点通过抓包软件可以确认
  77.         
  78.         .setRequestHeader "Accept", accept
  79.         If referer <> "" Then
  80.         .setRequestHeader "Referer", referer
  81.         End If
  82.         .setRequestHeader "User-Agent", useragent
  83.         .setRequestHeader "Content-Type", contype
  84.         .setRequestHeader "Connection", alive
  85.         If leg <> 0 Then
  86.         .setRequestHeader "Content-Length", leg
  87.         End If
  88.         '.setRequestHeader "Cookie", Cookie
  89.         .send
  90.         .WaitForResponse
  91.         getrptext = .responseText
  92.      objstatus = .Status
  93.    
  94.     End With

  95. End Sub
  96. Private Sub getDatays(objwinhttp As Object, URL As String)
  97.      With objwinhttp
  98.         .Option(6) = False
  99.          '.Option(WinHttpRequestOption_EnableHttp1_1) = False
  100.          .Open "GET", URL, False                                  '获取第一个动态的POST参数,一般是用GET提交得到,这一点通过抓包软件可以确认"
  101.         .setRequestHeader "Accept", "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"
  102.         .setRequestHeader "Referer", "http://123.81.251.164:7001/4/query_user_info_computer_e_toolbar.jsp"
  103.         .setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 1.1.4322)"
  104.         '.setRequestHeader "Accept-Encoding", "gzip, deflate"
  105.         .setRequestHeader "Connection", "close"
  106.         .setRequestHeader "Cookie", Cookie
  107.         .setRequestHeader "Host", "123.81.251.164:7001"
  108.         .send
  109.         .WaitForResponse
  110.         getrptext = .responseText
  111.         
  112.         
  113.         objstatus = .Status
  114.    
  115.     End With

  116. End Sub
  117. Private Sub getDataxml(objxmlhttp As Object, URL As String)
  118.      With objxmlhttp
  119.         '.Option(6) = False
  120.         
  121.         .Open "GET", URL, False                                  '获取第一个动态的POST参数,一般是用GET提交得到,这一点通过抓包软件可以确认"
  122.         .setRequestHeader "Accept", "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"
  123.         .setRequestHeader "Referer", "http://123.81.251.164:7001/4/query_user_info_computer_e_toolbar.jsp"
  124.         .setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3; .NET CLR 1.1.4322)"
  125.         .setRequestHeader "Accept-Encoding", "gzip, deflate"
  126.         .setRequestHeader "Connection", "Keep-Alive"
  127.         .setRequestHeader "Cookie", Cookie
  128.         '.setRequestHeader "Hose", "123.81.251.164:7001"
  129.         .send
  130.         '.WaitForResponse
  131.        MsgBox .readyState
  132.       
  133.         
  134.         
  135.         
  136.         If .readyState = 3 Then
  137.                 getrptext = .responseBody
  138.         End If
  139.         
  140.         Debug.Print getrpbody
  141.         objstatus = .Status
  142.    
  143.     End With

  144. End Sub

  145. Private Sub postData(objwinhttp As Object, URL As String)
  146.      With objwinhttp
  147.         .Option(6) = False                                          '不重定向
  148.         .Open "post", URL, False                                    '获取第一个动态的POST参数,一般是用GET提交得到,这一点通过抓包软件可以确认
  149.         
  150.         .setRequestHeader "Accept", accept
  151.         If referer <> "" Then
  152.         .setRequestHeader "Referer", referer
  153.         End If
  154.         .setRequestHeader "User-Agent", useragent
  155.         .setRequestHeader "Content-Type", contype
  156.         .setRequestHeader "Connection", alive
  157.         If leg <> 0 Then
  158.         .setRequestHeader "Content-Length", leg
  159.         End If
  160.         '.setRequestHeader "Cookie", Cookie
  161.         .send (data)
  162.         .WaitForResponse
  163.          getrptext = .responseText
  164.          

  165.      objstatus = .Status
  166.    
  167.    
  168.     End With

  169. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2015-5-15 20:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
cmcboy 发表于 2015-5-15 18:02
看fiddler 中的textview 显示如下。

数据在别的链接吧
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-10-6 20:35 , Processed in 0.036571 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表