ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 不懂html也来学网抓(xmlhttp/winhttp+fiddler)

    [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-10-21 19:41 | 显示全部楼层
本帖已被收录到知识树中,索引项:网页交互
顶起来看看

TA的精华主题

TA的得分主题

发表于 2014-10-21 20:16 | 显示全部楼层
的确是好东西,帮顶!等有空一定学学

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-21 21:39 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-22 07:14 编辑

获取数据-防盗链的处理-模拟Referer:


当你的vba代码中:
GET部分后面的URL与Request框中的一摸一样;
或是POST的URL、SendData,与Request框中的一摸一样,Content-Type也没有忘记setRequestHeader;
但数据仍旧无法获取时,那你要获取的数据网页一定加了某种防盗链的措施。

此时要开始我们漫长的抓包调试过程了。(路漫漫其修远兮。。。)

调试这样的防盗链网页,如果在Request框中看到有这样的字样:
Referer: http://.......
那么,你首选模拟Referer(因为模拟Referer最简单)

在xmlhttp对象里模拟Referer是无效的。必须要用winhttp对象。


举例:
网站:http://www.sgs.gov.cn/lz/etpsInfo.do?method=index
操作:点选“企业名称”,在空白框内输入“通用技术集团医药控股有限公司”后点击“搜索”,在随后跳出的页面里点击“详细信息”,需要获取该公司的详细信息数据。

根据本楼之前的方法编写的代码:
  1. Sub Main()
  2.     Dim strText As String
  3.     With CreateObject("MSXML2.XMLHTTP") 'CreateObject("WinHttp.WinHttpRequest.5.1")
  4.         .Open "POST", "http://www.sgs.gov.cn/lz/etpsInfo.do?method=viewDetail", False
  5.         .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  6. '        .setRequestHeader "Referer", ""
  7.         .send "etpsId=150000012002040300047"
  8.         strText = .responseText
  9.         Debug.Print strText
  10.     End With
  11. End Sub
复制代码
运行后,立即窗口显示:
Referer1.png

模拟Referer后的代码:
Sub Main()
    Dim strText As String
    With CreateObject("WinHttp.WinHttpRequest.5.1") 'CreateObject("MSXML2.XMLHTTP") '
        .Open "POST", "http://www.sgs.gov.cn/lz/etpsInfo.do?method=viewDetail", False
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .setRequestHeader "Referer", "http://www.sgs.gov.cn/lz/etpsInfo.do?method=doSearch"
        .send "etpsId=150000012002040300047"
        strText = .responseText
        Debug.Print strText
    End With
End Sub
再次运行,立即窗口即出现相关企业的详细信息。
Referer2.png


小贴士:除了Content-Type、Referer和Cookie,其他setRequestHeader的情况很少见。

点评

谢谢分享啊  发表于 2014-11-24 14:07

评分

4

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-21 21:55 | 显示全部楼层
本帖最后由 acecrazy 于 2014-12-11 14:17 编辑

获取数据-防盗链的处理-模拟Cookie:

再次提醒,抓包前请先清除浏览器所有Cookie、缓存、历史数据。

举例:
网站:http://www.gzgczj.com:8080/costRegulatory/user.do?method=changeIndex&fareaId=1
操作:点击“控制价备案”,获取工程名称和招标控制价信息数据。

此网页模拟Referer后仍然无法获取数据。于是考虑模拟Cookie。
复制数据页面的cookie值,填入代码中(先不要去掉Referer的模拟):
Cookie1.png
  1. Sub Main()
  2.     Dim strText As String
  3.     With CreateObject("WinHttp.WinHttpRequest.5.1")
  4.         .Open "GET", "http://www.gzgczj.com:8080/costRegulatory/project.do?method=showProjectList&isVisitor=1&f_id=11011&t1413902083242", False
  5.         .setRequestHeader "Referer", "http://www.gzgczj.com:8080/costRegulatory/user.do?method=changeIndex&fareaId=1"
  6.         .setRequestHeader "Cookie", "E0685A9F6B708A1F1039BF2322B82A35"
  7.         .Send
  8.         strText = .responsetext
  9.         Debug.Print strText
  10.     End With
  11. End Sub
复制代码
运行,,立即窗口显示“请重新登录”!
Cookie2.png

这是为什么呢?这是因为Cookie失效了!我们需要模拟“新鲜”的Cookie才行!

模拟“新鲜”Cookie的方法:
1、复制上面Cookie值字符串。
2、搜索Session框内第一次出现此Cookie值的网页:
Cookie3.png

Cookie4.png

3、编写代码,获取该Cookie,然后模拟写入数据网页:
  1. Sub Main()
  2.     Dim strText As String
  3.     Dim strCookie As String
  4.    
  5.     With CreateObject("WinHttp.WinHttpRequest.5.1")
  6.         .Option(6) = False ' 禁止重定向,以获取原网页信息
  7.         .Open "GET", "http://www.gzgczj.com:8080/costRegulatory/user.do?method=changeIndex&fareaId=1", False
  8.         .Send
  9.         strText = .getAllResponseHeaders '获取所有的回应头信息
  10.         Debug.Print strText: Stop '在立即窗口里查看头信息
  11.         strCookie = Split(Split(strText, "Set-Cookie: ")(1), ";")(0) '取出Cookie值
  12.     End With
  13.    
  14.     '在同一个winhttp对象里能保留cookie,为了体现设置cookie的作用,启用一个新的winhttp对象
  15.     With CreateObject("WinHttp.WinHttpRequest.5.1")
  16.         .Open "GET", "http://www.gzgczj.com:8080/costRegulatory/project.do?method=showProjectList&isVisitor=1&f_id=11011&t1413902083242", False
  17.         .setRequestHeader "Referer", "http://www.gzgczj.com:8080/costRegulatory/user.do?method=changeIndex&fareaId=1"
  18.         .setRequestHeader "Cookie", strCookie '模拟Cookie
  19.         .Send
  20.         strText = .responsetext
  21.         Debug.Print strText
  22.     End With
  23. End Sub
复制代码
运行。。查看立即窗口,数据获取成功。
注意:本cookie是存在于重定向之前的网页的,要取到该cookie,必须禁用重定向。关于重定向,请参考108楼的帖子
不要用getResponseHeader("Set-Cookie")获取回应头信息中的Cookie值。如果有多个Cookie值,用getResponseHeader("Set-Cookie")获取不到完整的Cookie值。

你如果认为模拟Cookie只能写setRequestHeader的话,你就大错特错了。

xmlhttp对象和winhttp对象均可以保留Cookie。
也就是说,要获取某个网页的Cookie,可以先发送对此网页的请求(GET或POST)。只要xmlhttp对象或winhttp对象不关闭,此Cookie在对象运行期间全程有效。


据此,上述代码可以简化为:
  1. Sub Main()
  2.     Dim strText As String
  3.     With CreateObject("WinHttp.WinHttpRequest.5.1")
  4.         .Open "GET", "http://www.gzgczj.com:8080/costRegulatory/user.do?method=changeIndex&fareaId=1", False
  5.         .Send '此次send是为了获取cookie
  6.         .Open "GET", "http://www.gzgczj.com:8080/costRegulatory/project.do?method=showProjectList&isVisitor=1&f_id=11011&t1413902083242", False
  7.         .setRequestHeader "Referer", "http://www.gzgczj.com:8080/costRegulatory/user.do?method=changeIndex&fareaId=1"
  8.         .Send
  9.         strText = .responsetext
  10.         Debug.Print strText
  11.     End With
  12. End Sub
复制代码
运行。。查看立即窗口,数据同样获取成功。

小贴士:用setRequestHeader方法模拟Cookie时,要用winhttp对象。发送网页的请求获取Cookie则xmlhttp、winhttp都可以。

点评

你可以找个修改Cookie并提交,以欺骗服务器的例子,这样会更好的理解Cookie欺骗的意义及作用  发表于 2014-10-24 09:53
winhttp所有cookie在释放后就会销毁,也不存在和人家共享。  发表于 2014-10-21 22:07
cookie有两种,一种会话cookie,一种持久cookie,会话cookie是在内存的,关闭或通讯结束可立即过期。持续cookie是可保留在硬盘的。xmlhttp可共享到ie的持久cookie,或者excel本进程的webbrowser的所有cookie。  发表于 2014-10-21 22:06
呵呵,xmlhttp的cookie很有趣,例如excel建一个webbrowser,登陆后的cookie,在xmlhttp里面可以直接发送。常用于变态登陆页面手工操作,然后批量刷数据。  发表于 2014-10-21 22:02

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-21 21:58 | 显示全部楼层
wcymiss 发表于 2014-10-21 21:39
获取数据-防盗链的处理-模拟Referer:

不知道吴姐,有没有研究过https加密网站同时还要发送证书的

点评

你这个,主要你是内网,实在难以模拟。另外,现在一时也早不到还用证书登陆的页面。不然很容易帮你试。  发表于 2014-10-21 22:08

TA的精华主题

TA的得分主题

发表于 2014-10-21 22:13 | 显示全部楼层
回复弦月老师,其实也不算内网,用了证书可以登陆,不过公司有登陆日志。今天用ie方法获取856页数据,用了28分钟。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-21 22:16 | 显示全部楼层
dg831451 发表于 2014-10-21 21:58
不知道吴姐,有没有研究过https加密网站同时还要发送证书的

https做过,但没遇到过有证书问题的网页。

winhttp有个选项可以忽略证书错误(Option(4) = 13056),但这可能不是你要的。

点评

这个就像浏览器证书错误,点继续浏览,不是发证书去校验。  发表于 2014-10-21 22:18

TA的精华主题

TA的得分主题

发表于 2014-10-21 22:18 | 显示全部楼层
wcymiss 发表于 2014-10-21 14:13
新手作业:
1、网站:http://data.bank.hexun.com/lccp/jrxp.aspx
     操作:点击“今日在售产品”,获取 ...

第一题
  1. Sub 按钮1_单击()
  2.     Dim url, html
  3.     url = "http://data.bank.hexun.com/lccp/Jrxp.aspx?"
  4.     url = url & "col=1"
  5.     url = url & "&tag=desc"
  6.     url = url & "&date=2014-10-21" '查询日期
  7.     url = url & "&page=1" '查询页码

  8.     Set html = CreateObject("htmlfile")
  9.     With CreateObject("msxml2.xmlhttp")
  10.         .Open "get", url, False
  11.         .send
  12.         html.body.innerhtml = .responsetext
  13.         Set tb = html.all.tags("table")(1).Rows
  14.         For i = 0 To tb.Length - 1
  15.             For j = 1 To tb(i).Cells.Length - 1
  16.                 Cells(i + 1, j) = tb(i).Cells(j).innertext
  17.             Next
  18.         Next
  19.     End With
  20. End Sub
复制代码

点评

这些作业是给新手做的呀。。您就别来凑热闹了呗  发表于 2014-10-21 23:19

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-21 22:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
好东西,一口气读了下来,继续期待后续,强烈推荐。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-21 22:30 | 显示全部楼层
本帖最后由 浮华、缠绕指尖 于 2014-10-21 22:43 编辑

吴姐,俺知道这是你一直以来蓄谋已久的大招。。。

俺的网抓部分也是你一步一步带起来的,哈哈其实吧,个人觉得,大部分人都是拿来主义,你讲细了很多人都不会去自己动手分析了,实际上网抓就是一个苦差事,1、POST时各种动态参数的寻找与分析,2、各种模拟头文件去伪造,3、相对轻松的字符串处理。

呵呵,你这也算是师傅带入门,修行看个人了。

点评

网抓用最简洁的语言表述就是:模拟到位,处理字符。完毕。O(∩_∩)O  发表于 2014-10-22 06:44
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-13 14:28 , Processed in 0.041638 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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