ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] 解析网页源码,获得所需数据。

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2017-11-1 12:59 | 显示全部楼层 |阅读模式
本帖最后由 Kaohsing 于 2017-11-16 10:27 编辑

http://www.yuncaijing.com/market ... =%E9%9B%84%E5%AE%89为例,介绍 如获得如图数据。(注:本文只针对已找到数据的真实地址,针对可以返回的数据处理,至于抓包请看大神们的帖子。)

最终数据.JPG






点评

之前的分类你写成了求助,现已修改  发表于 2017-11-2 13:27

评分

8

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-6 20:13 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-1 14:36 | 显示全部楼层
本帖最后由 Kaohsing 于 2017-11-4 07:54 编辑

一.split方法

第一,用fiddle等工具获得数据来源的真是网址。从fiddle中获得如下信息   GET http://www.yuncaijing.com/market ... =%E9%9B%84%E5%AE%89 HTTP/1.1  ‘请求方式及真是地址
   Host: www.yuncaijing.com
   Connection: keep-alive
   Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
   Upgrade-Insecure-Requests: 1
   User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.108 Safari/537.36
   Accept-Encoding: gzip, deflate
   Accept-Language: zh-CN,zh;q=0.8

数据源.JPG

第二网抓主要代码
    Set oHttp = CreateObject("WinHttp.WinHttpRequest.5.1")   
     With oHttp
     .Open "GET", "http://www.yuncaijing.com/markethot/discovery.html?keyword=%E9%9B%84%E5%AE%89", False
      .send
      tt = .responseText
    End With

第三处理返回的数据 就是   tt = .responseText,这里用split.返回的数据太大,大约57860.
大小.JPG
查看网页源代码,可以知道所需数据在蓝字与绿字之间,那就用split切割一下.
<th data-module="sorting"data-type="limit_times"><nobr>年涨停次数<i class="icon icon-asc"></i><iclass="icon icon-desc"></i></nobr></th>
        </tr>        </thead>        <tbody data-sortinger class="tbr">
                <trdata-p="42.39" data-about="100" data-r="197.89"data-ltsz="10.81" data-limit_times = "23">
            <td><ahref="/quote/sh603903.html" target="_blank"data-showchart-code="603903">中持股份</a></td>  中间 省略

             <tr data-p="10.79"data-about="1" data-r="-8.71" data-ltsz="274.69"data-limit_times = "1">
            <td><ahref="/quote/sh600376.html" target="_blank"data-showchart-code="600376">首开股份</a></td>
             <td >10.79</td><td >1%</td>  <tdclass="stockgreen   "  >-8.71%</td>  <td>274.69亿</td>   <td>1次</td>
       </tr>        </tbody>        </table>    </div>      </section>

这里用了 Split(Split(tt, " <tbody data-sortinger class=""tbr"">")(1), "</table>")(0)这句进行切割,看下图
初次切割.JPG

由于每支股票的所需数据都是如下形式,大部分数据都在黑体字之后,所以还需要split一下。
<tr data-p="42.39" data-about="100" data-r="197.89" data-ltsz="10.81" data-limit_times = "23">
            <td><a href="/quote/sh603903.html" target="_blank" data-showchart-code="603903">中持股份</a></td>
             <td >42.39</td>             <td >100%</td>             <td class=" stockred"  >197.89%</td>             <td>10.81亿</td>      <td>23次</td>

这里用了 Split(zz, "data-showchart-code=""")这句进行切割,数据显现出来了。看下图。
继续切割.JPG
接下啦就是便利每只股票
    zz(1) : "603903">中持股份</a></td>             <td >42.05</td>      <td >100%</td>   <td class=" stockred"  >195.50%</td>       <td>10.81亿</td>
语句如下(注意:td标签中有空格)
? Split(Split(zz(i), ">")(1), "<")(0)          ‘  中持股份      ? Split(Split(zz(i), "<td >")(1), "<")(0)     ’42.05
? Split(Split(zz(i), "<td >")(2), "<")(0)   ’100%           ? Split(Split(zz(i), """  >")(1), "<")(0)       ’195.50%
?  Split(Split(zz(i), "<td>")(1), "<")(0)     ‘10.81亿        ? Split(Split(zz(i), "<td>")(2), "<")(0)         23次
至于直接复制给单元格还是数组,这里不做研究啦。

获得数据.JPG


所用代码:
Sub kaohsng()
    Set oHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
    With oHttp
       .Open "GET", "http://www.yuncaijing.com/markethot/discovery.html?keyword=%E9%9B%84%E5%AE%89", False
      .send
      tt = .responseText
    End With
    zz = Split(Split(tt, " <tbody data-sortinger class=""tbr"">")(1), "</table>")(0)
    zz = Split(zz, "data-showchart-code=""")
    For i = 1 To UBound(zz)
      Debug.Print "股票名字:" & Split(Split(zz(i), ">")(1), "<")(0) & vbTab & "最新价" & Split(Split(zz(i), "<td >")(1), "<")(0) _
             & vbTab & "相关性:" & Split(Split(zz(i), "<td >")(2), "<")(0) & vbTab & "今年涨幅" & Split(Split(zz(i), """  >")(1), "<")(0) _
             & vbTab & "流通市值 :" & Split(Split(zz(i), "<td>")(1), "<")(0) & vbTab & "年涨停次数:" & Split(Split(zz(i), "<td>")(2), "<")(0)
   Next
End Sub




补充内容 (2019-3-17 18:41):
网页已改版.

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-1 15:23 | 显示全部楼层
本帖最后由 Kaohsing 于 2017-11-2 12:59 编辑


二还是split
   仔细查看源码,发现数据还在黑体字中,大部分是用引号分割
<tr data-p="42.15" data-about="100" data-r="196.21" data-ltsz="10.81" data-limit_times = "23">
            <td><a href="/quote/sh603903.html" target="_blank" data-showchart-code="603903">中持股份</a></td>
       <td >42.15</td>      <td >100%</td>    <td class=" stockred"  >196.21%</td>       <td>10.81亿</td>       <td>23次</td>

   好了修改代码:  zz = Split(zz, "<tr data-p="""),比刚才强多了

分析.JPG


股票名字:   Split(Split(zz(i), """>")(2), "</")(0)          最新价: Split(zz(i), """")(0)                           相关性 Split(Split(zz(i), "t=""")(1), """")(0)
今年涨幅     Split(Split(zz(i), "r=""")(1), """")(0)         流通市值 Split(Split(zz(i), "z=""")(1), """")(0)  年涨停次数    Split(Split(zz(i), "times = """)(1), """")(0)
最终数据:
数据1.JPG

所用代码:Sub kaohsing2()
    Set oHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
    With oHttp
       .Open "GET", "http://www.yuncaijing.com/markethot/discovery.html?keyword=%E9%9B%84%E5%AE%89", False
       .send
       tt = .responseText
    End With
    zz = Split(Split(tt, "<tbody data-sortinger class=""tbr"">")(1), "</table>")(0)
    zz = Split(zz, "<tr data-p=""")  
    For i = 1 To UBound(zz) '           
      Debug.Print "股票名字:" & Split(Split(zz(i), """>")(2), "</")(0) & vbTab & "最新价" & Split(zz(i), """")(0) _
             & vbTab & "相关性:" & Split(Split(zz(i), "t=""")(1), """")(0) & vbTab & "今年涨幅" & Split(Split(zz(i), "r=""")(1), """")(0) _
             & vbTab & "流通市值 :" & Split(Split(zz(i), "z=""")(1), """")(0) & vbTab & "年涨停次数:" & Split(Split(zz(i), "times = """)(1), """")(0)            
   Next
End Sub
当然还可以这样:"股票名字:" & Split(Split(zz(i), """>")(2), "</")(0) _
             & vbTab & "最新价" & Split(zz(i), """")(0) _
            & vbTab & "相关性:" & Split(Split(zz(i), """")(2), """")(0) _
           & vbTab & "今年涨幅" & Split(Split(zz(i), """")(4), """")(0) _
         & vbTab & "流通市值 :" & Split(Split(zz(i), """")(6), """")(0) _
        & vbTab & "年涨停次数:" & Split(Split(zz(i), """")(8), """")(0)

用split解析少量数据还是可以。





TA的精华主题

TA的得分主题

发表于 2017-11-2 09:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Kaohsing 发表于 2017-11-1 15:23
二还是split仔细查看源码,发现数据还在黑体字中大部分是用引号分割

            中持股份

解释得很详细,看看能学会吗

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-2 09:24 | 显示全部楼层
三还是split
     用split解析有时比较麻烦,需要一步步接近所需数据,虽然麻烦,但是能得到数据。特别是在获取财经类数据是,虽然能用 Set js =CreateObject("MSScriptControl.ScriptControl")   js.Language = "javascript"能获取数据,但是在64位的机子上就趴窝,就运行不了,如果没有找到很好的办法,那就用用split吧。下面举例说明。

列一
目标.png

全部数据的地址:
http://data.eastmoney.com/DataCe ... DateTime=2017-11-01

一条数据的地址:
http://data.eastmoney.com/DataCe ... DateTime=2017-11-01

不做处理返回的数据:
split0.png
   数据的机构:     var IBFdtAvr={"success":true,"pages":1995,"data":[{}.......{}],"url":"http://datainterface3.eastmoney.com//EM_DataCenter_V3/api/CJRL/GetCJRL?tkn=eastmoney&type=1&startDate=2017-01-01&endDate=2017-11-01&pageNum=1&pageSize=1&sortdirect=0&cfg=cjhyrl"}
所需的数据在红色部分{}.......{},别的都是绿叶衬托说明用的. 那就用大体切割一下 Split(Split(tt, "[{")(1), "}]")(0).返回的数据如下: split1.png
切割前后的对比,tt1快要接近所要的数据啦,贴一个切割后的数据:{},{},........{},仔细观察每条数据都在{}中,每条数据是以},{间隔,继续split。语句 Split(tt1, "},{"),返回的结果如下

split2.png 每条数据都显现出来了,下面进行精细切割
以ghb(17)为例 .获得具体的数据。如果想获得全部的数据,遍历一下数据即可。
         Split(Split(ghb(17), """:""")(1), """")(0) & "__ " & Split(Split(ghb(17), """:""")(2), """")(0) _
     & vbCrLf & Split(Split(ghb(17), """:""")(5), """")(0) & "__ " & Split(Split(ghb(17), """:""")(6), """")(0) _
     & vbCrLf & Split(Split(ghb(17), """:""")(7), """")(0) & "__" & Split(Split(ghb(17), """:""")(8), """")(0) _
     & vbCrLf & Split(Split(ghb(17), """:""")(9), """")(0) & "__" & Split(Split(ghb(17), """:""")(10), """")(0) _
     & vbCrLf & Split(Split(ghb(17), """:""")(11), """")(0) & "__" & Split(Split(ghb(17), """:""")(12), """")(0) _
     & vbCrLf & Split(Split(ghb(17), """:""")(13), """")(0) & "__" & Split(Split(ghb(17), """:""")(14), """")(0) _
      & vbCrLf & Split(Split(ghb(17), """:""")(15), """")(0) & "__" & Split(Split(ghb(17), """:""")(16), """")(0) _
     & vbCrLf & Split(Split(ghb(17), """:""")(17), """")(0)    废话不多说。上截图验证一下.
效果.png
最后附上代码:
  1. Sub KaoHsing()
  2.     t = Timer
  3.     Dim sURL$, Pages%
  4.     Dim tt$, tt1$
  5.     Dim ghb, kao
  6.     Dim i%, j%, k%
  7.     ka = Array(, 0, 16, 1, 13, 14, 15, 2, 8, 9)
  8.     URL = "http://data.eastmoney.com/DataCenter_V3/cjrl/getData.ashx?&pagesize=50&page=1&js=var%20IBFdtAvr&#182;m=&" _
  9.         & "sortRule=1&sortType=ConferenceDate&code=&startDateTime=" & InputBox("请输入开始年月日(yyyy-mm-dd)", "温馨提示", "2017-01-01") & "&endDateTime=" & InputBox("请输入结束年月日", "温馨提示", "2017-11-01")
  10.     Application.ScreenUpdating = False
  11.     ActiveSheet.UsedRange.Offset(1, 0).Clear
  12.     With CreateObject("WinHttp.WinHttpRequest.5.1")
  13.         .Open "GET", URL, False
  14.         .send
  15.         Pages = Split(Split(.responsetext, "pages"":")(1), ",""data")(0) * 50
  16.         .Open "GET", Replace(URL, "50", Pages), False
  17.         .send
  18.         tt = .responsetext
  19.         tt1 = Split(Split(tt, "[{")(1), "}]")(0)
  20.         ghb = Split(tt1, "},{")
  21.       Stop
  22.     End With
  23.     'Debug.Print ghb(17)
  24.        Debug.Print "-------------------------    " & _
  25.        vbCrLf & Split(Split(ghb(17), """:""")(1), """")(0) & "__ " & Split(Split(ghb(17), """:""")(2), """")(0) _
  26.      & vbCrLf & Split(Split(ghb(17), """:""")(5), """")(0) & "__ " & Split(Split(ghb(17), """:""")(6), """")(0) _
  27.      & vbCrLf & Split(Split(ghb(17), """:""")(7), """")(0) & "__" & Split(Split(ghb(17), """:""")(8), """")(0) _
  28.      & vbCrLf & Split(Split(ghb(17), """:""")(9), """")(0) & "__" & Split(Split(ghb(17), """:""")(10), """")(0) _
  29.      & vbCrLf & Split(Split(ghb(17), """:""")(11), """")(0) & "__" & Split(Split(ghb(17), """:""")(12), """")(0) _
  30.      & vbCrLf & Split(Split(ghb(17), """:""")(13), """")(0) & "__" & Split(Split(ghb(17), """:""")(14), """")(0) _
  31.       & vbCrLf & Split(Split(ghb(17), """:""")(15), """")(0) & "__" & Split(Split(ghb(17), """:""")(16), """")(0) _
  32.      & vbCrLf & Split(Split(ghb(17), """:""")(17), """")(0) & "__" & Split(ghb(17), """:""")(18)
  33.     For i = 0 To UBound(ghb)
  34.         If InStr(ghb(i), "ContentFlag"":""1") Then
  35.             kao = Split(ghb(i), """,""")
  36.             k = k + 1
  37.             Cells(k + 1, 1) = k
  38.             For j = 1 To UBound(ka)
  39.                 Cells(k + 1, j + 1) = Split(kao(ka(j)), ":""")(1)
  40.             Next
  41.         End If
  42.     Next
  43.     Columns("B:C").NumberFormatLocal = "yyyy/m/d"
  44.     Application.ScreenUpdating = True
  45.     MsgBox "用时" & Timer - t & vbCrLf & "找到" & k & "条信息."
  46. End Sub
复制代码



评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-2 09:26 | 显示全部楼层
五指山888 发表于 2017-11-2 09:09
解释得很详细,看看能学会吗

光看不行,实际操作一番试试,再说。

TA的精华主题

TA的得分主题

发表于 2017-11-2 09:31 | 显示全部楼层
Kaohsing 发表于 2017-11-1 14:36
一.split方法

第一,用fiddle等工具获得数据来源的真是网址。从fiddle中获得如下信息GET http://www.yu ...

不错,老师讲得很详细,呵呵。。。问下,这个网页上鼠标一移动到股票名称上就出现这个分时图,VBA怎么可以实现这样?

TA的精华主题

TA的得分主题

发表于 2017-11-2 09:36 来自手机 | 显示全部楼层
Kaohsing 发表于 2017-11-1 15:23
二还是split仔细查看源码,发现数据还在黑体字中大部分是用引号分割

            中持股份

网抓   主要是在于“抓”这个字,抓下来后的 数据 的处理 还有  正则法、解析法等!还是重点在于如何抓到 需要 的数据,后期的 数据处理 显得没有 抓数据那么重要。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-2 09:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
duquancai 发表于 2017-11-2 09:36
网抓   主要是在于“抓”这个字,抓下来后的 数据 的处理 还有  正则法、解析法等!还是重点在于如何抓到 ...

    那是如何操作fiddle等工具的过程,请看吴姐等等大神的帖子。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-11-2 11:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 Kaohsing 于 2017-11-2 19:23 编辑
kings12333 发表于 2017-11-2 09:31
不错,老师讲得很详细,呵呵。。。问下,这个网页上鼠标一移动到股票名称上就出现这个分时图,VBA怎么可 ...

    VBA中也可以呀,数据下载好,生成折线图,添加图表事件,完全可以模仿一下。股票的折现图,k线图等等大部分是个gif,这要导入这个GIF就可以啦。     我以为是说这个网页的折线图呢,好像是使用js的图表插件。要想生成此类网页图表,需要huang1314wei大神介绍搭建的php平台,安装数据库,图表插件,写好html,方可生成乱着图表,否则只是静态网页,点来点去只是那几个死数据,以上只是自己一点简介,仅供参考。




您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-27 05:03 , Processed in 0.040572 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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