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 17:52 | 显示全部楼层
本帖已被收录到知识树中,索引项:网页交互
本帖最后由 blanksoul12 于 2014-10-28 22:58 编辑

http://www.hkexnews.hk/sdw/search/search_sdw_c.asp
股份代號 輸入8056 查詢
這個怎麼找?

已解決了

TA的精华主题

TA的得分主题

发表于 2014-10-28 17:58 来自手机 | 显示全部楼层
blanksoul12 发表于 2014-10-28 17:52
http://www.hkexnews.hk/sdw/search/search_sdw_c.asp
股份代號 輸入8056 查詢
這個怎麼找?

例子楼主会提供,这种问题别在这里问,请另外发帖求助。

TA的精华主题

TA的得分主题

发表于 2014-10-28 18:04 | 显示全部楼层
可以可以,那請問可以刪走它嗎?

TA的精华主题

TA的得分主题

发表于 2014-10-28 18:51 | 显示全部楼层
wcymiss 发表于 2014-10-22 16:45
获取数据-防盗链的处理-动态参数

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

吴老师,59楼这个航班信息的例子,查来查去还是以前的信息(10月22日),我原来还以为通过第一次send后获取的sn可以在第二次send后获取今天的sn,可是我看了还是22日的。
为了获得今天的信息,我用fiddler抓出的信息是:

GET http://webflight.linkosky.com/WE ... ;image.y=13&Sn=4a8649481e59583f006f592ca003f6da HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://webflight.linkosky.com/WE ... x=36&image.y=13
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
DNT: 1
Host: webflight.linkosky.com
Cookie: ASP.NET_SessionId=oe3ku145lkzw2mrq1itakg55

然后我在session里查找 sn的值  “4a8649481e59583f006f592ca003f6da” ,找到两个,我选取第一个:

GET http://webflight.linkosky.com/WEB/Flight/WaitingSearch.aspx?JT=1&OC=PEK&DC=SHA&dstDesp=GUANGZHOU%B9%E3%D6%DD&dst2=CAN&DD=2014-10-28&DT=7&BD=&BT=7&AL=ALL&DR=true&image.x=36&image.y=13 HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://www.caac.gov.cn/S1/GNCX/
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
DNT: 1
Host: webflight.linkosky.com
Cookie: ASP.NET_SessionId=oe3ku145lkzw2mrq1itakg55

我把红色的网址放入您写的代码中,就能查到今天的信息了,可这两次send和原来一次send没什么区别呀?

TA的精华主题

TA的得分主题

发表于 2014-10-28 19:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wcymiss 发表于 2014-10-22 16:45
获取数据-防盗链的处理-动态参数

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

两次send:

Sub Main5()
    Dim strText As String
    Dim strHost As String
    Dim strURL As String
    strHost = "http://webflight.linkosky.com"
    With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "GET", strHost & "/WEB/Flight/WaitingSearch.aspx?JT=1&OC=PEK&DC=SHA&dstDesp=GUANGZHOU%B9%E3%D6%DD&dst2=CAN&DD=2014-10-28&DT=7&BD=&BT=7&AL=ALL&DR=true&image.x=36&image.y=13", False
        .setRequestHeader "Referer", "http://www.caac.gov.cn/S1/GNCX/"
        .Send
        strText = .responsetext
        strURL = Split(Split(strText, "setTimeout(""window.location.replace('")(1), "'")(0)
        
        .Open "GET", strHost & strURL, False
        .Send
        strText = .responsetext
        CopyToClipbox (strText)
        Debug.Print strText
    End With
End Sub

一次send:

Sub Main()
    Dim strText As String
    strHost = "http://webflight.linkosky.com"
    With CreateObject("WinHttp.WinHttpRequest.5.1")
        .Open "GET", "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-28&DT=7&BD=&BT=7&AL=ALL&DR=true&image.x=37&image.y=11&Sn=4a8649481e59583f006f592ca003f6da", False
        .setRequestHeader "Referer", "http://www.caac.gov.cn/S1/GNCX/"
        .Send
        strText = .responsetext
    End With
End Sub

这两个得到的信息是一样的,我原以为通过第一次send可以自动找到当天的sn,可没找到

点评

第一次open里面的url里,有日期参数。你更改那个参数就可以看到任意一天的航班信息了(当然过期的查不到)。  发表于 2014-10-28 22:50
sn在第一次send后的responsetext里。第一次send的目的就是为了取得这个sn。  发表于 2014-10-28 22:43

TA的精华主题

TA的得分主题

发表于 2014-10-28 20:03 | 显示全部楼层
本帖最后由 onlycxb 于 2014-10-28 23:47 编辑
  1. 此楼可直接跳过,看265楼


  2. 干了一天的活,挤出一点时间更正一下44楼代码。取出多项数据。现在还有一个问题,就是Sn=4a8649481e59583f006f592ca003f6da,这个代码如何得到,这个目前未知,有知道的希望告知。

  3. Sub 作业1_2_获取航班信息数据()
  4. '网站:http://www.caac.gov.cn/S1/GNCX/
  5. '操作:点击“查询”,获取航班信息数据。
  6.     Dim St As String, Url$, arr, brr, Crr
  7.     Dim S1$, S2$, i%, j%, rng As Range

  8.     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-28&DT=7&BD=&BT=7&AL=ALL&DR=true&image.x=35&image.y=14&Sn=4a8649481e59583f006f592ca003f6da"
  9.     With CreateObject("WinHttp.WinHttpRequest.5.1")
  10.         .Open "GET", Url, False
  11.         .Send
  12.         St = .responsetext
  13.     End With
  14.     Cells.Clear
  15.     '
  16.     If InStr(St, "<div id=""FlightListFlight0"">") < 1 Then
  17.         Cells(1, 1) = "抱歉!没有满足条件的航班,请重新输入查询条件! "
  18.     Else
  19.         St = Split(Split(St, "<div id=""FlightListFlight0"">")(1), "</div><br>")(0)
  20.         With ActiveSheet
  21.             Cells(1, 1).Resize(1, 3).Merge
  22.             Cells(2, 1).Resize(1, 3).Merge
  23.             Cells(1, 1).Resize(1, 3) = Split(Split(St, "<div class=""menu_layout3""><strong>")(1), "<")(0)    '选择去程(北京首都---上海虹桥)航班
  24.             Cells(2, 1).Resize(1, 3) = Split(Split(St, "<div class=""layout2_title3"">")(1), "<")(0)          '北京首都至上海虹桥 出发日期:2014-10-28
  25.             arr = Split(St, "<div class=""menu_layout2"">")
  26.             For i = 1 To UBound(arr)
  27.                 S1 = arr(i)
  28.                 Crr = Split(S1, "<div class=""menu4_layout"">")
  29.                 ReDim brr(1 To UBound(Crr) - 1 + 3, 1 To 3)                  '
  30.                 brr(1, 1) = Trim(Split(Split(S1, "<div class=""menu_top1"">")(1), "<")(0))                                          '航空公司
  31.                 brr(1, 2) = Trim(Split(Split(S1, "<div class=""menu_top2"">        <strong><span class=""red_font"">")(1), "<")(0)) '航班
  32.                 brr(1, 3) = Split(Split(S1, "<div class=""menu_top2"">")(2), "<")(0)                                                '机型
  33.                 For j = 2 To UBound(Crr)
  34.                     S2 = Crr(j)
  35.                     brr(j, 1) = Split(S2, "</div>")(0)
  36.                     brr(j, 2) = Split(Split(S2, "<div class=""menu5_layout"">")(1), "</div>")(0)
  37.                     brr(j, 3) = Split(Split(S2, "<div class=""menu6_layout"">")(1), "</div>")(0)
  38.                 Next j
  39.                 Set rng = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
  40.                 rng.Resize(UBound(brr, 1), UBound(brr, 2)) = brr
  41.             Next i
  42.         End With
  43.     End If
  44. End Sub
复制代码

点评

sn的获取我在59楼帖子里有讲啊http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1159783&pid=7906842  发表于 2014-10-28 21:55

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-10-28 20:16 | 显示全部楼层
楼主的帖子太棒了,赞一个

点评

谢谢前辈鼓励!请多提意见!  发表于 2014-10-28 21:56

TA的精华主题

TA的得分主题

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

ReDim brr(1 To UBound(Crr) - 1 + 3, 1 To 3)
这里为什么+3? 这个新版把 “飞行线路” 去掉了,只剩下 “航空公司”,从实际情况看应该+1吧?

TA的精华主题

TA的得分主题

发表于 2014-10-28 21:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
winland 发表于 2014-10-28 20:16
楼主的帖子太棒了,赞一个

连WINLAND前辈都光临了,可见吴女神的帖子有多火。

TA的精华主题

TA的得分主题

发表于 2014-10-28 22:10 | 显示全部楼层
本帖最后由 引子玄 于 2014-10-28 22:27 编辑

“本帖主要针对的是不懂html的网抓新手”————说真话,偶咋就看不懂呢?
不过一直没装fiddler(本人崇尚“徒手擒拿”)
看得晕乎乎的~~~


真正的新手,我想,基本上是“一定”,会比我还更晕眩,也许——“徒手派”和“武器派”的习惯方式不太兼容?

点评

帖子的名称就包含了fiddler,讲解也是从fiddler着手。真正的新手不安装fiddler不一步步模拟照做肯定没法看懂帖子。毋庸置疑。  发表于 2014-10-28 22:53
什么地方看不懂尽可以提,欢迎探讨。  发表于 2014-10-28 22:19
帖子里的例子都是借助fiddler的辅助寻找数据的真实地址的。因为fiddler界面清晰,对新手来说更易查看。其实现在很多浏览器都自带了抓包功能。  发表于 2014-10-28 22:18
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 12:49 , Processed in 0.042220 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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