|
楼主 |
发表于 2014-10-21 21:55
|
显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 acecrazy 于 2014-12-11 14:17 编辑
获取数据-防盗链的处理-模拟Cookie:
再次提醒,抓包前请先清除浏览器所有Cookie、缓存、历史数据。
举例:
网站:http://www.gzgczj.com:8080/costRegulatory/user.do?method=changeIndex&fareaId=1
操作:点击“控制价备案”,获取工程名称和招标控制价信息数据。
此网页模拟Referer后仍然无法获取数据。于是考虑模拟Cookie。
复制数据页面的cookie值,填入代码中(先不要去掉Referer的模拟):
- Sub Main()
- Dim strText As String
- With CreateObject("WinHttp.WinHttpRequest.5.1")
- .Open "GET", "http://www.gzgczj.com:8080/costRegulatory/project.do?method=showProjectList&isVisitor=1&f_id=11011&t1413902083242", False
- .setRequestHeader "Referer", "http://www.gzgczj.com:8080/costRegulatory/user.do?method=changeIndex&fareaId=1"
- .setRequestHeader "Cookie", "E0685A9F6B708A1F1039BF2322B82A35"
- .Send
- strText = .responsetext
- Debug.Print strText
- End With
- End Sub
复制代码 运行,,立即窗口显示“请重新登录”!
这是为什么呢?这是因为Cookie失效了!我们需要模拟“新鲜”的Cookie才行!
模拟“新鲜”Cookie的方法:
1、复制上面Cookie值字符串。
2、搜索Session框内第一次出现此Cookie值的网页:
3、编写代码,获取该Cookie,然后模拟写入数据网页:- Sub Main()
- Dim strText As String
- Dim strCookie As String
-
- With CreateObject("WinHttp.WinHttpRequest.5.1")
- .Option(6) = False ' 禁止重定向,以获取原网页信息
- .Open "GET", "http://www.gzgczj.com:8080/costRegulatory/user.do?method=changeIndex&fareaId=1", False
- .Send
- strText = .getAllResponseHeaders '获取所有的回应头信息
- Debug.Print strText: Stop '在立即窗口里查看头信息
- strCookie = Split(Split(strText, "Set-Cookie: ")(1), ";")(0) '取出Cookie值
- End With
-
- '在同一个winhttp对象里能保留cookie,为了体现设置cookie的作用,启用一个新的winhttp对象
- With CreateObject("WinHttp.WinHttpRequest.5.1")
- .Open "GET", "http://www.gzgczj.com:8080/costRegulatory/project.do?method=showProjectList&isVisitor=1&f_id=11011&t1413902083242", False
- .setRequestHeader "Referer", "http://www.gzgczj.com:8080/costRegulatory/user.do?method=changeIndex&fareaId=1"
- .setRequestHeader "Cookie", strCookie '模拟Cookie
- .Send
- strText = .responsetext
- Debug.Print strText
- End With
- 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在对象运行期间全程有效。
据此,上述代码可以简化为:- Sub Main()
- Dim strText As String
- With CreateObject("WinHttp.WinHttpRequest.5.1")
- .Open "GET", "http://www.gzgczj.com:8080/costRegulatory/user.do?method=changeIndex&fareaId=1", False
- .Send '此次send是为了获取cookie
- .Open "GET", "http://www.gzgczj.com:8080/costRegulatory/project.do?method=showProjectList&isVisitor=1&f_id=11011&t1413902083242", False
- .setRequestHeader "Referer", "http://www.gzgczj.com:8080/costRegulatory/user.do?method=changeIndex&fareaId=1"
- .Send
- strText = .responsetext
- Debug.Print strText
- End With
- End Sub
复制代码 运行。。查看立即窗口,数据同样获取成功。
小贴士:用setRequestHeader方法模拟Cookie时,要用winhttp对象。发送网页的请求获取Cookie则xmlhttp、winhttp都可以。
|
评分
-
2
查看全部评分
-
|