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 22:39 | 显示全部楼层
本帖已被收录到知识树中,索引项:网页交互
wcymiss 发表于 2014-10-21 14:13
新手作业:
1、网站:http://data.bank.hexun.com/lccp/jrxp.aspx
     操作:点击“今日在售产品”,获取 ...

第二题
  1. Sub 按钮2_单击()
  2.     Dim url, html
  3.     url = "http://webflight.linkosky.com/WEB/Flight/FlightSearchResultDefault.aspx?JT=1"
  4.     url = url & "&OC=PEK"    '北京首都机场
  5.     url = url & "&DC=SHA"    '上海虹口机场
  6.     url = url & "&dstDesp=GUANGZHOU%B9%E3%D6%DD"
  7.     url = url & "&dst2=CAN"
  8.     url = url & "&DD=2014-10-22"    '查询日期
  9.     url = url & "&DT=7"
  10.     url = url & "&BD="
  11.     url = url & "&BT=7"
  12.     url = url & "&AL=ALL"    '全部航空
  13.     url = url & "&DR=true"
  14.     url = url & "&image.x=33"
  15.     url = url & "&image.y=9"
  16.     url = url & "&Sn=87bf24142bc0c78727610871f373e0a7"

  17.     Set html = CreateObject("htmlfile")
  18.     With CreateObject("msxml2.xmlhttp")
  19.         .Open "get", url, False
  20.         .send
  21.         html.body.innerhtml = .responsetext


  22.         Set tb = html.all.tags("div")
  23.         For i = 0 To tb.Length - 1
  24.             If tb(i).classname = "menu_layout2" Or tb(i).classname = "listone_layout" Or tb(i).classname = "listtwo_layout" Or tb(i).classname = "menu_content_small2" Then
  25.                 n = n + 1
  26.                 For j = 0 To tb(i).childnodes.Length - 1
  27.                     Cells(n, j + 1) = tb(i).childnodes(j).innertext
  28.                 Next

  29.             End If
  30.         Next
  31.     End With
  32. End Sub
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-21 23:12 | 显示全部楼层
期待大神完整作品,尤其是防盗链处理方面的知识。还有验证码的问题

点评

验证码的水太深了。。  发表于 2014-10-22 06:44

TA的精华主题

TA的得分主题

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

继续唠叨Cookie。。。

33楼的例子里,Cookie值的最初来源,来自服务器返回的回应头信息的“Set-Cookie”,它对winhttp对象的Cookie进行了设置。这种Cookie来源,不需要写setRequestHeader来模拟Cookie,只需发送一下相关页面的请求即能获取该Cookie。

但有些网页的Cookie值,来源并非是回应头信息的“Set-Cookie”。它可能是responsetext中的一部分。这时就只能setRequestHeader了。

(刚刚想找一个我以前写过的Cookie存在于responsetext的例子,发现网站竟然改版了,也“Set-Cookie”了!!)
征求Cookie存在于responsetext的例子。。。。

点评

可以重定向再唠嗑。重定向很多cookie因为跨域问题,都要手工发。回头我也找看看。  发表于 2014-10-22 10:54

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-22 08:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 onlycxb 于 2014-10-22 08:31 编辑
wcymiss 发表于 2014-10-21 14:13
新手作业:
1、网站:http://data.bank.hexun.com/lccp/jrxp.aspx
     操作:点击“今日在售产品”,获取 ...

作业2、网站:http://www.caac.gov.cn/S1/GNCX/,     操作:点击“查询”,获取航班信息数据。
  1. Sub 作业1_2_获取航班信息数据()
  2. '网站:http://www.caac.gov.cn/S1/GNCX/
  3. '操作:点击“查询”,获取航班信息数据。
  4.     Dim St As String, Url$, arr, brr, Crr
  5.     Dim S1$, S2$, i%, j%, rng As Range
  6.     Url = "http://webflight.linkosky.com/WEB/Flight/FlightSearchResultDefault.aspx?JT=1&OC=PEK&DC=SHA&dstDesp=GUANGZHOU%B9%E3%D6%DD&dst2=CAN&DD=2014-10-22&DT=7&BD=&BT=7&AL=ALL&DR=true&image.x=37&image.y=9&Sn=87bf24142bc0c78727610871f373e0a7"
  7.     With CreateObject("WinHttp.WinHttpRequest.5.1")
  8.         .Open "GET", Url, False
  9.         .Send
  10.         St = .responsetext
  11.     End With
  12.     '
  13.     If InStr(St, "<div id=""FlightListFlight0"">") < 1 Then
  14.         Cells(1, 1) = "抱歉!没有满足条件的航班,请重新输入查询条件! "
  15.     Else
  16.         St = Split(Split(St, "<div id=""FlightListFlight0"">")(1), "</div><br>")(0)
  17.         With ActiveSheet
  18.             Cells(1, 1) = Split(Split(St, "<strong>")(1), "</strong>")(0)
  19.             arr = Split(St, "<div class=""menu_layout2"">")                                        '航空公司分组
  20.             For i = 1 To UBound(arr)
  21.                 S1 = arr(i)
  22.                 Crr = Split(S1, "<div class=""listtwo_layout"">")
  23.                 ReDim brr(1 To UBound(Crr) + 2, 1 To 5)                                         '班次UBound(S1) + 1,航空公司及机行+1,航线+1
  24.                 '航空公司
  25.                 brr(1, 1) = Trim(Split(Split(S1, "<div class=""menu_top1"">")(1), "</div>")(0))          '中国东方航空公司
  26.                 brr(1, 2) = Trim(Split(Split(S1, "<div class=""menu_top2"">")(1), "</div>")(0))          '航班
  27.                 brr(1, 2) = Trim(Split(Split(brr(1, 2), "font"">")(1), "</span>")(0))
  28.                 brr(1, 3) = Trim(Split(Split(S1, "<div class=""menu_top2"">")(2), "</div>")(0))          ''机型:333
  29.                 '飞行线路
  30.                
  31.                 brr(2, 1) = Trim(Split(Split(S1, "<div class=""menu1_layout"">")(1), "</div>")(0))       '北京首都机场
  32.                 brr(2, 2) = Trim(Split(Split(S1, "<div class=""menu2_layout"">")(1), "</div>")(0))       '(22:00)
  33.                 brr(2, 3) = Trim(Split(Split(S1, "<div class=""menu3_layout"">")(1), "</div>")(0))       '经停:0
  34.                 brr(2, 4) = Trim(Split(Split(S1, "<div class=""menu1_layout"">")(2), "</div>")(0))       '上海虹桥机场
  35.                 brr(2, 5) = Trim(Split(Split(S1, "<div class=""menu2_layout"">")(2), "</div>")(0))       '(23:55)
  36.                 '飞行班次
  37.                 For j = 1 To UBound(Crr)
  38.                 S2 = Crr(j)
  39.               '  Debug.Print S2
  40.                 brr(2 + j, 1) = Trim(Split(Split(S2, "<div class=""menu4_layout"">")(1), "</div>")(0)) '票价
  41.                 brr(2 + j, 2) = Trim(Split(Split(S2, "<div class=""menu5_layout"">")(1), "</div>")(0)) '舱位'
  42.                 brr(2 + j, 3) = Trim(Split(Split(S2, "<div class=""menu6_layout"">")(1), "</div>")(0)) '票数'
  43.                '……
  44.                
  45.                 Next j
  46.                 Set rng = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
  47.                 rng.Resize(UBound(brr, 1), 5) = brr
  48.    
  49.             Next i
  50.         End With
  51.     End If
  52. End Sub
复制代码
'顺便把航空公司抓了一下 捕获.PNG
  1. Sub 作业1_2_航空公司获取()
  2. '网站:http://www.caac.gov.cn/S1/GNCX/
  3. '操作:点击“查询”,获取航班信息数据。
  4.     Dim strText As String
  5.     With CreateObject("MSXML2.XMLHTTP")
  6.         .Open "GET", "http://www.caac.gov.cn/images/airlinecontrol.js", False
  7.         .Send
  8.         strText = .responsetext
  9.         Debug.Print ByteToStr(.responseBody, "GB2312")
  10.     End With
  11. End Sub

  12. Function ByteToStr(arrByte, strCharset As String) As String
  13.     With CreateObject("Adodb.Stream")
  14.         .Type = 1 'adTypeBinary
  15.         .Open
  16.         .Write arrByte
  17.         .Position = 0
  18.         .Type = 2 'adTypeText
  19.         .Charset = strCharset
  20.         ByteToStr = .Readtext
  21.         .Close
  22.     End With
  23. End Function






复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-22 09:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好好学习,天天向善

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-22 11:10 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-22 12:32 编辑

还是Cookie。。。

模拟Cookie的宗旨是向服务器发送一个它认可的Cookie。不管这个Cookie是回话Cookie还是持久Cookie,甚至该Cookie根本不存在你的电脑中(无论内存还是硬盘),只要服务器认可就行。

举例:
网站:http://club.excelhome.net/
操作:登录EH,在论坛首页点击“我发布的主题”,获取自己的主题帖数据。

EH的登录添加了验证码,这对我们初学网抓的人来说用xmlhttp/winhttp模拟登录EH是个无法克服的难题。

但是我们可以模拟Cookie来实现查询效果呀!

步骤:
1、抓包确认数据页面所在session。
2、点击该session的Request框的Cookie按钮可查看发送头内的Cookie内容。(挤在一起还是看不清楚)
EH1.png

3、点击Request框的Header按钮查看Cookie更清晰:
EH2.png

抓到的Cookie有很多,但不是每一个都需要模拟的。

经验:10位数字值一般都是用来记录时间的,这样的Cookie值一般不大会作为服务器的辨识标志,所以我们也一般不用模拟它。 (注意我用了“一般”这个词)

去除值为数字或空白的Cookie,只取值为字母数字混合物的Cookie写入代码中:
  1. Sub Main()
  2.     Dim strText As String
  3.     Const saltkey As String = "oUuXXXX"'请复制你自己的Cookie粘贴到这里。下同
  4.     Const sid As String = "tXXXX"
  5.     Const auth As String = "a30eEZTXXXXXXXXXXXXXXXXXXXX"
  6.     Const cookiereport As String = "f1fXXXXXXXXXXXXXXXXXXXXXXXX"
  7.     Const ulastactivity As String = "84cXXXXXXXXXXXXXXXXXXXX"
  8.     Const touclick As String = "70a9vPXXXXXXXXXXXXXXXXXXXX"
  9.     Const member_login_uid As String = "218917"
  10.     Const member_login_sid As String = "tXXXX"
  11.    
  12.     With CreateObject("WinHttp.WinHttpRequest.5.1")
  13.         .Open "GET", "http://club.excelhome.net/home.php?mod=space&do=thread&view=me ", False
  14.         .setRequestHeader "Cookie", _
  15.         "5WOj_b676_saltkey=" & saltkey _
  16.         & ";5WOj_b676_sid=" & sid _
  17.         & ";5WOj_b676_auth=" & auth _
  18.         & ";5WOj_b676_cookiereport=" & cookiereport _
  19.         & ";5WOj_b676_ulastactivity=" & ulastactivity _
  20.         & ";5WOj_b676_touclick=" & touclick _
  21.         & ";5WOj_b676_member_login_uid=" & member_login_uid _
  22.         & ";5WOj_b676_member_login_sid=" & member_login_sid
  23.         .Send
  24.         strText = .responsetext
  25.         Debug.Print strText
  26.     End With
  27. End Sub
复制代码
运行。。查看立即窗口,获取数据成功。

继续测试,去除一些对获取数据无影响的Cookie(连论坛ID都去除了,大跌眼镜),代码最后成型为:
  1. Sub Main()
  2.     Dim strText As String
  3.     Const saltkey As String = "oUuXXXX"
  4.     Const auth As String = "a30eEZTXXXXXXXXXXXXXXXXXXXX"
  5.    
  6.     With CreateObject("WinHttp.WinHttpRequest.5.1")
  7.         .Open "GET", "http://club.excelhome.net/home.php?mod=space&do=thread&view=me ", False
  8.         .setRequestHeader "Cookie", _
  9.         "5WOj_b676_saltkey=" & saltkey _
  10.         & ";5WOj_b676_auth=" & auth
  11.         .Send
  12.         strText = .responsetext
  13.         Debug.Print strText
  14.     End With
  15. End Sub
复制代码
这两个Cookie值就是EH的关键登录Cookie。它不需要保存在你的电脑里(本地电脑清除cookie、缓存后代码依旧运行成功)。我不知道它在服务器上的生存期有多长,我用了三天依然有效,哪怕在这三天内已经无数次的在不同地点手工重新登录过EH。有兴趣的话可以自己测试下它的生存期。

评分

7

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-22 11:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
xmyjk 发表于 2014-10-21 22:19
好东西,一口气读了下来,继续期待后续,强烈推荐。

重定向在目录已经列出,在后面的知识点中会讲到。

TA的精华主题

TA的得分主题

发表于 2014-10-22 11:45 | 显示全部楼层
本帖最后由 lolmuta 于 2014-10-22 12:11 编辑

真心不错                     

TA的精华主题

TA的得分主题

发表于 2014-10-22 11:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wcymiss 发表于 2014-10-22 11:10
还是Cookie。。。

模拟Cookie的宗旨是向服务器发送一个它认可的Cookie。不管这个Cookie是回话Cookie还是 ...

大师,如何抓取有用户名 和密码 等网站 里面的数据,用户名和密码要如何弄

点评

这个问题,如果你一楼楼跟着我一起动手学习的话,应该可以自己解决。  发表于 2014-10-22 12:24

TA的精华主题

TA的得分主题

发表于 2014-10-22 12:00 | 显示全部楼层
suwenkai 发表于 2014-10-21 22:39
第二题

大师,如何抓取有用户名 和密码 等网站 里面的数据,用户名和密码要如何弄
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-23 16:01 , Processed in 0.049914 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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