ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1716|回复: 10

[求助] 请问如何抓取这个网页的数据?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-8-12 08:06 | 显示全部楼层 |阅读模式
本帖最后由 Kaohsing 于 2016-8-12 08:45 编辑

途牛网

途牛网

请问如何抓取这个网页的数据?抓包显示有数据,但是抓不到?麻烦大家给看看。

机票.rar

275.55 KB, 下载次数: 12

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-12 08:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
代码:Dim DicCodeTf
Private Sub 途牛机票()
    Dim strText$, url$
    Dim a$, b$
  
    If IsEmpty(DicCodeTf) Then
       GetCodeDicTF
    End If
    On Error Resume Next
  
     a = hzToUtf8("济南") '出发站
     b = hzToUtf8("兰州") '到达站
    url = "http://www.tuniu.com/flight/city_" & DicCodeTf(a) & "_" & DicCodeTf(b) & "/"
     
     With CreateObject("WinHttp.WinHttpRequest.5.1") 'CreateObject("MSXML2.XMLHTTP") '
      .Open "POST", url, False
      .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
      .setRequestHeader "Referer", "http://www.tuniu.com/flight/"
     ' .setRequestHeader "cookie", ""
      .send "type=1&start=2016-08-19&adult=4&child=1"
       strText = .responsetext
    End With '"
   
  
    strText = HtmlFilter(strText, " var Arg =", "</script>")
   CopyToClipbox strText
   
    Set js = CreateObject("scriptcontrol")
    js.Language = "jscript"
    js.addcode ("ghb =" & strText)
    Stop

End Sub

Sub GetCodeDicTF()
     
   Dim strText$
   Dim regx, mh
    With CreateObject("MSXML2.XMLHTTP") 'CreateObject("WinHttp.WinHttpRequest.5.1")
      .Open "GET", "http://www.tuniu.com/flight/", False
      .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" '
      .send
       strText = .responsetext
    End With
    strText = HtmlFilter(strText, "var CitiesList =", ";")
   '----------------------------------------------------------------------------------------------------------------
   'Debug.Print strText
   Set regx = CreateObject("vbscript.regexp") '[\u4e00-\u9fff]
   ' regx.Pattern = "(\d{3,4}).{2}\w{8}.{3}((\\[0-9a-z]{5}){2,4})"
   regx.Pattern = "(\d{3,4}).{2}\w{8}.{3}([\u4e00-\u9fff]{2,4})"

    regx.Global = True
    'regx.MultiLine = True
   
    Set DicCodeTf = CreateObject("scripting.dictionary")
    Set mh = regx.Execute(strText)
    Stop
    For Each mhk In mh
      Stop
     If Not DicCodeTf.exists(mhk.SubMatches(0)) Then
       DicCodeTf(mhk.SubMatches(1)) = mhk.SubMatches(0)
       End If
    Next
   
End Sub
Sub CopyToClipbox(strText As String)     '文本拷贝到剪贴板
  With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    .SetText strText
    .PutInClipboard
   End With
End Sub

Public Function HtmlFilter(ByVal htmlText$, Label1$, Label2$)
    '返回html字符串lable1和最近的lable2标签中的数据
    Dim pStart As Long, pStop As Long
    pStart = InStr(htmlText, Label1) + Len(Label1)
                         '找到标签信息的起始位置
    If pStart <> 0 Then
        pStop = InStr(pStart, htmlText, Label2)
        HtmlFilter = Mid(htmlText, pStart, pStop - pStart)
    End If
End Function
Function hzToUtf8(hz As String) As String
    Dim intP As Integer
    Dim strP As String, Tex As String
    For intP = 1 To Len(hz)
        strP = Mid(hz, intP, 1)
        Tex = LCase(Tex & "\u" & Right("0000" & Hex$(AscW(strP)), 4))
    Next intP
    hzToUtf8 = Tex
End Function

TA的精华主题

TA的得分主题

发表于 2016-8-12 10:59 | 显示全部楼层
"var Arg=...."行数据并不是航班信息数据. 而是"低价日历"行数据.航班信息数据在另外一个js文件中,其url由javaScrit生成.确定它很麻烦,有兴趣的高手可以去试试.

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-12 14:36 | 显示全部楼层
谢谢大神,正在看你的正则学习材料,其中有个问题:strText中{........"cityCode":402,"cityName":"\u798f\u5dde","cityAbb .....}想抓取其中的402和\u798f\u5dde,不知正则如何写?恳请指点。

TA的精华主题

TA的得分主题

发表于 2016-8-12 15:04 | 显示全部楼层
Kaohsing 发表于 2016-8-12 14:36
谢谢大神,正在看你的正则学习材料,其中有个问题:strText中{........"cityCode":402,"cityName":"%u798f% ...

需要的只是\u798f\u5dde对应的代号,可用正则: (\d+),[^\\]+\\u798f\\u5dde

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-12 16:06 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
可能没说明白,要提取大量的\uxxxx的码,另外 regx.Pattern = "((\d{3,4})(?=.{2}cityName.{3}))(((\\\w{5}){2,4})(?=.{3}cityAbb))",为什么取不出值?

TA的精华主题

TA的得分主题

发表于 2016-8-12 17:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Kaohsing 发表于 2016-8-12 16:06
可能没说明白,要提取大量的%uxxxx的码,另外 regx.Pattern = "((\d{3,4})(?=.{2}cityName.{3}))(((\\\w{5} ...

建议不要再折腾了,要提取该网站航班信息太难了.

TA的精华主题

TA的得分主题

发表于 2016-8-12 19:12 | 显示全部楼层
liu-aguang 发表于 2016-8-12 17:05
建议不要再折腾了,要提取该网站航班信息太难了.

没多难吧,实在不行可以用IE实现吧

TA的精华主题

TA的得分主题

发表于 2016-8-12 19:14 | 显示全部楼层
本帖最后由 liu-aguang 于 2016-8-12 19:16 编辑
屌爆了z 发表于 2016-8-12 19:12
没多难吧,实在不行可以用IE实现吧

用IE应该可以的.用msxml2.xmlhttp有点难.

TA的精华主题

TA的得分主题

发表于 2016-8-13 08:32 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 09:23 , Processed in 0.034721 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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