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-28 22:24 | 显示全部楼层
本帖已被收录到知识树中,索引项:网页交互
本帖最后由 renahu 于 2014-10-28 22:26 编辑
wcymiss 发表于 2014-10-22 16:45
获取数据-防盗链的处理-动态参数

相同方式操作网页,抓包能得到相同的参数值,这样的参数是静态的。反之 ...


吴老师,请看254和255楼的提问,sn的获取在59楼帖子里是有讲, 但是要看当天信息,还是要用fiddler去抓,不抓sn就无法更新,59楼的两次send和一次send一样啊

TA的精华主题

TA的得分主题

发表于 2014-10-28 22:49 | 显示全部楼层

吴姐。这几天忙得都没时间做作业了。。。

写了三个简单的。。而且就一个对数据进行了处理,等过段时间闲了再补上。。。

       吴姐别说我懒哈~~~

  1. 吴姐。这几天忙得都没时间做作业了。。。
  2. 写了三个简单的。。而且就一个对数据进行了处理,等过段时间闲了再补上。。。
  3. [code]Option Explicit
  4. Dim d As New Dictionary
  5. Dim xml As New MSXML2.XMLHTTP
  6. Private Sub optOneway_Change()
  7.     Me.DTPRetureDate.Enabled = Me.optReture.Value: Me.cmbRetureTime.Enabled = Me.optReture.Value
  8. End Sub
  9. Private Sub optReture_Change()
  10.     Me.DTPRetureDate.Enabled = Me.optReture.Value: Me.cmbRetureTime.Enabled = Me.optReture.Value
  11. End Sub
  12. Private Sub UserForm_Initialize()
  13. Dim i As Integer, strText As String
  14. Dim arr
  15.     For i = 7 To 23 Step 2
  16.         Me.cmbStartTime.AddItem i & "点"
  17.         Me.cmbRetureTime.AddItem i & "点"
  18.     Next
  19.     Me.cmbStartTime.ListIndex = 0
  20.     Me.cmbRetureTime.ListIndex = 0
  21.     With xml
  22.         .Open "GET", "http://www.caac.gov.cn/images/airlinecontrol.js", False
  23.         .Send
  24.         arr = Split(执行(BinToStr(.ResponseBody, "GB2312") & "var s='';s=airlines;"), ",")
  25.             For i = 1 To UBound(arr) Step 2
  26.                 d(arr(i)) = arr(i - 1)
  27.                 Me.cmbCompany.AddItem arr(i)
  28.             Next
  29.             Me.cmbCompany.ListIndex = 0
  30.         .Open "GET", "http://www.caac.gov.cn/images/city.js", False
  31.         .Send
  32.         arr = Split(执行(BinToStr(.ResponseBody, "GB2312") & "var s='';s=air_cities;"), ",")
  33.             For i = 1 To UBound(arr) Step 2
  34.                 d(arr(i)) = arr(i - 1)
  35.                 Me.cmbDepart.AddItem arr(i)
  36.                 Me.cmbArrive.AddItem arr(i)
  37.             Next
  38.             Me.cmbDepart.ListIndex = Int(Me.cmbDepart.ListCount * Rnd)
  39.             Me.cmbArrive.ListIndex = Int(Me.cmbArrive.ListCount * Rnd)
  40.     End With
  41.     Me.optOneway.Value = True
  42.     Me.optDirect.Value = True
  43.     Me.DTPStarDate.Value = Now: Me.DTPRetureDate.Value = Now
  44. End Sub
  45. Private Sub btnQuery_Click()
  46. Dim winHttp As New winHttp.WinHttpRequest, html As New HTMLDocument
  47. Dim URL As String, Sn As String, strText As String, tb, arr, brr
  48. Dim i, n, j
  49.     URL = "http://webflight.linkosky.com/WEB/Flight/WaitingSearch.aspx?"
  50.     URL = URL & "JT=" & IIf(Me.optOneway, 1, 2) '单程or往返
  51.     URL = URL & "&OC=" & d(Me.cmbDepart.Text)   '出发地
  52.     URL = URL & "&DC=" & d(Me.cmbArrive.Text)   '目的地
  53.     URL = URL & "&dstDesp=GUANGZHOU%B9%E3%D6%DD"
  54.     URL = URL & "&dst2=CAN"
  55.     URL = URL & "&DD=" & Format(Me.DTPStarDate.Value, "YYYY-MM-DD")    '查询出发日期
  56.     URL = URL & "&DT=" & Replace(Me.cmbStartTime.Text, "点", "")    '出发时间点
  57.     URL = URL & "&BD=" & Format(Me.DTPRetureDate.Value, "YYYY-MM-DD")   '返回日期
  58.     URL = URL & "&BT=" & Replace(Me.cmbRetureTime.Text, "点", "")   '返回时间点
  59.     URL = URL & "&AL=" & d(Me.cmbCompany.Text)  '公司
  60.     URL = URL & "&DR=" & IIf(Me.optDirect.Value, "true", "false")   '是否直达
  61.     URL = URL & "&image.x=29"
  62.     URL = URL & "&image.y=7"
  63.     With winHttp
  64.         .Open "GET", URL, False
  65.         .SetRequestHeader "Referer", "http://www.caac.gov.cn/S1/GNCX/"
  66.         .Send
  67.         If InStr(.ResponseText, "数据载入中") Then Sn = Split(Split(.ResponseText, "Sn=")(1), "')""")(0) Else MsgBox "网页出错,请重试": Exit Sub
  68.         URL = Replace(URL & "&Sn=" & Sn, "WaitingSearch", "FlightSearchResultDefault")
  69.         .Open "GET", URL, False
  70.         .Send
  71.         strText = .ResponseText
  72.     End With
  73.     If InStr(strText, "抱歉!没有满足条件的航班,请重新输入查询条件") Then
  74.         MsgBox "抱歉!没有满足条件的航班,请重新输入查询条件!"
  75.     Else
  76.         Cells.Clear
  77.         html.body.innerHTML = strText
  78.         Set tb = html.all.tags("div")
  79.         For i = 0 To tb.Length - 1
  80.             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
  81.                 n = n + 1
  82.                 For j = 0 To tb(i).ChildNodes.Length - 1
  83.                     Cells(n, j + 1) = tb(i).ChildNodes(j).innerText
  84.                 Next
  85.             End If
  86.         Next
  87.     End If
  88. End Sub
  89. Function BinToStr(arrBin, strChrs) '字节集转换,常用编码GBK,GB2312,UTF-8
  90.     With CreateObject("ADODB.Stream")
  91.         .Type = 2
  92.         .Open
  93.         .WriteText arrBin
  94.         .Position = 0
  95.         .Charset = strChrs
  96.         .Position = 2
  97.         BinToStr = .Readtext
  98.         .Close
  99.     End With
  100. End Function
  101. Function 执行(strJS As String)
  102.   With CreateObject("MSScriptControl.ScriptControl")
  103.         .Language = "javascript"
  104.         执行 = .Eval(strJS)
  105.     End With
  106. End Function
复制代码
[/code]



  1. 网抓作业.rar (22.19 KB, 下载次数: 136)
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-28 22:59 | 显示全部楼层
renahu 发表于 2014-10-28 19:01
两次send:

Sub Main5()

呵呵,吴老师您终于明白我的意思了,我也是刚发现,原来只要改日期就能看到不同时间的信息了,不用每天都用fiddler去抓了

TA的精华主题

TA的得分主题

发表于 2014-10-28 23:11 | 显示全部楼层
不好意思,請問可否說一下,responseBody及responsetext的分別嗎?

点评

嗯,谢谢提问,我在123楼(http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1159783&pid=7910492)进行了补充。  发表于 2014-10-29 09:46

TA的精华主题

TA的得分主题

发表于 2014-10-28 23:41 | 显示全部楼层
本帖最后由 onlycxb 于 2014-10-28 23:45 编辑
  1. 不断修改不断完善中!

  2. Sub 作业1_2_获取航班信息数据()
  3. '网站:http://www.caac.gov.cn/S1/GNCX/
  4. '操作:点击“查询”,获取航班信息数据。
  5.     Dim St As String, Url$, arr, brr, Crr, sntxt
  6.     Dim S1$, S2$, i%, j%, rng As Range, Flydate As Date
  7.     Flydate = #11/21/2014#                                                '查询飞行日期
  8.     '取第一个sn=出现的网址相关数据
  9.     Url = "http://webflight.linkosky.com/WEB/Flight/WaitingSearch.aspx?JT=1&OC=PEK&DC=SHA&dstDesp=GUANGZHOU%B9%E3%D6%DD&dst2=CAN&DD=" & Format(Flydate, "yyyy-mm-dd") & "&DT=7&BD=&BT=7&AL=ALL&DR=true&image.x=44&image.y=11"
  10.     With CreateObject("WinHttp.WinHttpRequest.5.1")

  11.         .Open "GET", Url, False
  12.         .setRequestHeader "Referer", "http://www.caac.gov.cn/S1/GNCX/"
  13.         .Send
  14.         sntxt = Split(Split(.responsetext, "window.location.replace('")(1), "'")(0)
  15. Debug.Print sntxt

  16.         .Open "GET", "http://webflight.linkosky.com" & sntxt, False
  17.         .setRequestHeader "Referer", "http://www.caac.gov.cn/S1/GNCX/"
  18.         .Send
  19.         St = .responsetext
  20.     End With
  21.     Cells.Clear
  22.     If InStr(St, "<div id=""FlightListFlight0"">") < 1 Then
  23.         Cells(1, 1) = "抱歉!没有满足条件的航班,请重新输入查询条件! "
  24.     Else
  25.         St = Split(Split(St, "<div id=""FlightListFlight0"">")(1), "</div><br>")(0)
  26.         With ActiveSheet
  27.             Cells(1, 1).Resize(1, 3).Merge
  28.             Cells(2, 1).Resize(1, 3).Merge
  29.             Cells(1, 1).Resize(1, 3) = Split(Split(St, "<div class=""menu_layout3""><strong>")(1), "<")(0)    '选择去程(北京首都---上海虹桥)航班
  30.             Cells(2, 1).Resize(1, 3) = Split(Split(St, "<div class=""layout2_title3"">")(1), "<")(0)          '北京首都至上海虹桥 出发日期:2014-10-28
  31.             arr = Split(St, "<div class=""menu_layout2"">")
  32.             For i = 1 To UBound(arr)
  33.                 S1 = arr(i)
  34.                 Crr = Split(S1, "<div class=""menu4_layout"">")
  35.                 ReDim brr(1 To UBound(Crr) - 1 + 3, 1 To 3)                  '
  36.                 brr(1, 1) = Trim(Split(Split(S1, "<div class=""menu_top1"">")(1), "<")(0))     '航空公司
  37.                 brr(1, 2) = Trim(Split(Split(S1, "<div class=""menu_top2"">        <strong><span class=""red_font"">")(1), "<")(0))    '航班
  38.                 brr(1, 3) = Split(Split(S1, "<div class=""menu_top2"">")(2), "<")(0)                 '机型
  39.                 For j = 2 To UBound(Crr)
  40.                     S2 = Crr(j)
  41.                     brr(j, 1) = Split(S2, "</div>")(0)
  42.                     brr(j, 2) = Split(Split(S2, "<div class=""menu5_layout"">")(1), "</div>")(0)
  43.                     brr(j, 3) = Split(Split(S2, "<div class=""menu6_layout"">")(1), "</div>")(0)
  44.                 Next j
  45.                 Set rng = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
  46.                 rng.Resize(UBound(brr, 1), UBound(brr, 2)) = brr
  47.             Next i
  48.         End With
  49.     End If
  50. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-10-28 23:42 | 显示全部楼层
wcymiss 发表于 2014-10-24 14:04
转码

1、有时我们获取到的数据,有很多乱码。

請問是否和這個 http://club.excelhome.net/thread-1137780-1-1.htmlhttp://club.excelhome.net/thread-1161601-1-2.html 情況也應該在 reponsebody 中解決呢?

点评

嗯,谢谢提问,我在123楼(http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1159783&pid=7910492)进行了补充。  发表于 2014-10-29 09:45

TA的精华主题

TA的得分主题

发表于 2014-10-28 23:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
265楼附件 网抓123 (自动保存的).rar (23.84 KB, 下载次数: 139)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-28 23:57 | 显示全部楼层
引子玄 发表于 2014-10-28 22:10
“本帖主要针对的是不懂html的网抓新手”————说真话,偶咋就看不懂呢?
不过一直没装fiddler(本人崇尚 ...

徒手擒拿,应该是较高境界,期待示范!

点评

不用武器网抓,原理主要是基于规避服务器取脚本代码(框架型),而转到浏览器取显示代码(本地化),非常便捷,比用武器省事。  发表于 2014-10-29 11:10

TA的精华主题

TA的得分主题

发表于 2014-10-29 08:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
onlycxb 发表于 2014-10-28 23:41

老师我就没明白为什么要加3呢,就算加上出发经停到达加2就够了,难道还有什么信息我没看见?

TA的精华主题

TA的得分主题

发表于 2014-10-29 09:07 | 显示全部楼层
onlycxb 发表于 2014-10-28 23:51
265楼附件

真棒,老师有空再加个录入时间和出发地,目的地选择的命令就完美了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 14:43 , Processed in 0.051327 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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