ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 网页抓取分享

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-10-20 16:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
onlycxb 发表于 2014-10-20 12:48
总页码我怎么没看到?

其实,用ie法也可解决:
Sub 新浪模拟交易3()
'On Error Resume Next
Cells.ClearContents
Dim p%, tp As Long, i%, j%, t, r As Object

With CreateObject("internetexplorer.application")
    .Visible = True
    .Navigate "http://jiaoyi.sina.com.cn/jy/stock/ranking/"
    Do Until .readyState = 4
        DoEvents
    Loop
   
    t = Timer
    Do While t + 5 > Timer
        DoEvents
    Loop
    Cells(1, 12) = Split(Split(.Document.all.tags("BODY")(0).innerText, "12345 共")(1), "页")(0) '此句显示总页数
    For p = 1 To 2
        t = Timer
        Do While t + 5 > Timer
            DoEvents
        Loop
        
        Set r = .Document.all.tags("table")(0).Rows
        For i = 0 To r.Length - 1
            For j = 0 To r(i).Cells.Length - 1
                Cells((p - 1) * 21 + i + 1, j + 1) = r(i).Cells(j).innerText
            Next j
        Next i
   
        .Document.all.tags("a")(94).Click
    Next p
End With
End Sub

TA的精华主题

TA的得分主题

发表于 2014-10-20 16:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 VBA万岁 于 2014-10-21 08:32 编辑
VBA万岁 发表于 2014-10-20 16:30
其实,用ie法也可解决:
Sub 新浪模拟交易3()
'On Error Resume Next


附件如下:
新浪模拟交易排行榜.zip (577.88 KB, 下载次数: 23)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-20 19:29 | 显示全部楼层
VBA万岁 发表于 2014-10-20 16:30
其实,用ie法也可解决:
Sub 新浪模拟交易3()
'On Error Resume Next

Cells(1, 12) = Split(Split(.Document.all.tags("BODY")(0).innerText, "12345 共")(1), "页")(0) '此句显示总页数,这里12345就不要取了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-20 22:26 | 显示全部楼层
本帖最后由 onlycxb 于 2014-10-21 08:03 编辑

分享8:
  1. Sub ()
  2. '需求:提取[url]http://www.cffex.com.cn/fzjy/tjsj/pztj/pzrtj/[/url]数据
  3. '特点:xml数据,乱码转换.
  4.     Dim objHR As New WinHttp.WinHttpRequest
  5.     Dim Url$, St$, xmlDoc, arr
  6.     Dim i%, j%, m%, n%
  7.     Url = "http://www.cffex.com.cn/fzjy/tjsj/pztj/pzrtj/2014/index.xml"
  8.     With objHR
  9.         .Open "GET", Url, False
  10. '        .SetRequestHeader "Accept", "application/xml, text/xml, */*"
  11. '        .SetRequestHeader "Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"
  12.         .Send
  13.         If .Status = 200 Then
  14.             St = StrConv(.ResponseBody, vbUnicode)              '原代码St = .ResponseText,为转码改现语句
  15.         End If
  16.     End With
  17.     With CreateObject("Microsoft.XMLDOM")
  18.         .LoadXML (St)
  19.         m = .DocumentElement.ChildNodes.Length
  20.         ReDim arr(1 To m, 1 To 7)

  21.         '以上可将网页数据保存入数组,根据需求,可加入类型(IF,TF)和日期条件,便可得到要查询的结果
  22.         For i = 1 To m
  23.             Set xmlDoc = .DocumentElement.ChildNodes(i - 1)
  24.             n = xmlDoc.ChildNodes.Length
  25.             For j = 1 To n
  26.                 arr(i, j) = xmlDoc.ChildNodes(j - 1).Text
  27.             Next j
  28.         Next i
  29.     End With

  30.     '     数组arr保存入表格代码省略
  31.     Sheet1.Cells.Clear
  32.     Sheet1.[a2].Resize(UBound(arr, 1), UBound(arr, 2)) = arr
  33. End Sub
复制代码

  1. Sub 品种日统计数据2()
  2.     Dim myQuery
  3.     With ActiveSheet
  4.         .Cells.Delete
  5.         Set myQuery = ActiveSheet.QueryTables.Add(Connection:="URL;http://www.cffex.com.cn/fzjy/tjsj/pztj/pzrtj/2014/index.xml", Destination:=.Cells(1, 1))
  6.     End With
  7.     myQuery.Refresh
  8. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-10-21 10:08 | 显示全部楼层
onlycxb 发表于 2014-10-20 22:26
分享8:

测试通过,多谢分享!
需添加引用如下:
添加引用.jpg

TA的精华主题

TA的得分主题

发表于 2014-10-21 12:35 | 显示全部楼层
onlycxb 发表于 2014-10-15 16:18
继续分享
分享5:提供地址:http://taobao.cjcp.com.cn/cjw11x5/view/11x5qianerzs-2-11ydj-11-3-1000.html
...

测试通过,多谢分享!
补上转码代码如下:

Function BytesToBstr(strBody, CodeBase)         '使用Adodb.Stream对象提取字符串
    Dim objStream
    On Error Resume Next
    Set objStream = CreateObject("Adodb.Stream")
    With objStream
        .Type = 1                               '二进制
        .Mode = 3                               '读写
        .Open
        .Write strBody                          '二进制数组写入Adodb.Stream对象内部
        .Position = 0                           '位置起始为0
        .Type = 2                               '字符串
        .Charset = CodeBase                     '数据的编码格式
        BytesToBstr = .ReadText                 '得到字符串
    End With
    objStream.Close
    Set objStream = Nothing
    If Err.Number <> 0 Then BytesToBstr = ""
    On Error GoTo 0
End Function

TA的精华主题

TA的得分主题

发表于 2014-10-21 14:55 | 显示全部楼层
VBA万岁 发表于 2014-10-21 12:35
测试通过,多谢分享!
补上转码代码如下:

Mark如附件:
十一运网抓.zip (1.75 MB, 下载次数: 32)

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-21 13:56 | 显示全部楼层
本帖最后由 onlycxb 于 2014-10-21 13:58 编辑

分享9
  1. Option Explicit

  2. Sub 招财宝综合排序数据抓取()
  3. 'https://zhaocaibao.alipay.com/pf/productList.htm?pfOrderStatus=&pfCurrentPage=210&pfOrderType=&fistView=1
  4.    Dim xml As New MSXML2.XMLHTTP, url$, St$, arr, i%, brr, crr, total%, page%, p%
  5.     Dim rng As Range

  6.     url = "https://zhaocaibao.alipay.com/pf/productList.htm?pfOrderStatus=&pfOrderType=&fistView=1&pfCurrentPage="
  7.    sheet1.cells.clear
  8.     With xml
  9.         .Open "GET", url & "210", False
  10.         .send
  11.         St = .responseText
  12.         total = Split(Split(St, "</span>页")(0), "/")(914)                                          '总数页
  13.     End With
  14.     '页数较多,近两千页,以取前3页为例
  15.     For p = 1 To 3                                                                                 'total
  16.         With xml
  17.             .Open "GET", url & page, False
  18.             .send
  19.             St = .responseText
  20.         End With
  21.         St = Replace(Replace(St, " ", ""), vbCrLf, "")
  22.         St = Replace(St, "<spanclass=""income-ui-tip"">", "")
  23.         arr = Split(St, "<liclass=""w154"">")
  24.         ReDim brr(1 To UBound(arr) - 2, 1 To 6)
  25.         For i = 2 To UBound(arr) - 1
  26.             brr(i - 1, 1) = Split(arr(i), "<")(0)
  27.             brr(i - 1, 2) = Split(Split(arr(i), "<")(3), ">")(1)
  28.             brr(i - 1, 3) = Split(Split(arr(i), "<")(8), ">")(1)
  29.             brr(i - 1, 4) = Split(Split(arr(i), "<")(10), ">")(1)
  30.             brr(i - 1, 5) = Split(Split(arr(i), "<")(16), ">")(1)
  31.             brr(i - 1, 6) = Replace(Split(Split(arr(i), "<")(20), ">")(1), "&nbsp;&nbsp;", "")
  32.         Next i
  33.         Set rng = Sheet1.Cells(Rows.Count, 1).End(xlUp)
  34.         rng.Resize(UBound(brr, 1), 6) = brr
  35.     Next p
  36. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-10-21 15:16 | 显示全部楼层
VBA万岁 发表于 2014-10-21 14:55
Mark如附件:

添加引用如下:
引用.jpg

TA的精华主题

TA的得分主题

发表于 2014-10-21 15:54 | 显示全部楼层
本帖最后由 VBA万岁 于 2014-10-21 15:56 编辑
onlycxb 发表于 2014-10-21 13:56
分享9


测试通过,多谢分享!
添加引用如59楼,
Mark如附件:
招财宝综合排序数据抓取.zip (364.84 KB, 下载次数: 41)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-12 06:16 , Processed in 0.027278 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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