ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 淘宝图片抓取

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-12-20 14:09 | 显示全部楼层
本帖已被收录到知识树中,索引项:网页交互
Option Explicit

Public TP%
Public arrNML

Public Sub TAOBAO()
    On Error Resume Next
   
    Dim rawDT$, smpic$, tmp
    Dim i&, j&, k&, n&, m&, tt&, tts&, row&
    Dim ttPage%
    Dim http As Object, ie As InternetExplorer
    Dim arrTMP, arrNID, arrEVE, arrSMPIC, arrBGPIC, arrPICT, arrPIC, arrCONTT(1 To 2, 1 To 5)
    Dim pic() As Byte
    Dim tm
    Dim fso
   
    Set http = CreateObject("MSXML2.XMLHTTP")
    Set ie = CreateObject("InternetExplorer.Application")
   
    With http
        Application.StatusBar = "打开首页"
        .Open "POST", "http://hk.taobao.com/", True
        .Send
        Do Until .readyState = 4
            DoEvents
        Loop
        
        rawDT = .responseText
        arrTMP = Split(rawDT, "</a> <a href=" & Chr(34) & "http://s.taobao.com/search?spm=1")
        
        ReDim arrNML(1 To 2, 1 To UBound(arrTMP))
        For i = 0 To UBound(arrTMP) - 1
            arrNML(1, i + 1) = Split(arrTMP(i), Chr(34) & ">")(UBound(Split(arrTMP(i), Chr(34) & ">")))
            arrNID = Split(rawDT, Chr(34) & ">" & arrNML(1, i + 1))
            arrNML(2, i + 1) = "http://s.taobao.com/search?spm=1" & Split(arrNID(0), "<a href=" & Chr(34) & "http://s.taobao.com/search?spm=1")(UBound(Split(arrNID(0), "<a href=" & Chr(34) & "http://s.taobao.com/search?spm=1")))
        Next
        
        PROD.Show
        
        '获取总页数
        Application.StatusBar = "获取宝贝总页数"
        .Open "POST", arrNML(2, TP), True
        .Send
        Do Until .readyState = 4
            DoEvents
        Loop
        
        tmp = Split(.responseText, "</span> <a href=")(0)
        ttPage = Split(tmp, "</strong>/")(UBound(Split(tmp, "</strong>/")))
        
        Set fso = CreateObject("Scripting.FileSystemObject")
        If Worksheets("TB").PICTX.text = "ONE" Then
            If fso.Folderexists(ThisWorkbook.path & "\" & arrNML(1, TP)) = False Then fso.CreateFolder ThisWorkbook.path & "\" & arrNML(1, TP)
        Else
            If fso.Folderexists(ThisWorkbook.path & "\" & arrNML(1, TP) & "B") = False Then fso.CreateFolder ThisWorkbook.path & "\" & arrNML(1, TP) & "B"
        End If
        Set fso = Nothing
        
        '取大图代码
        tt = 1: tts = 1
        For i = 1 To ttPage
            '进入某类总界面
            Application.StatusBar = "打开第" & i & "页宝贝"
            .Open "POST", arrNML(2, TP) & "&tab=all&bcoffset=-4&s=" & 44 * (i - 1), True
            .Send
            Do Until .readyState = 4
                DoEvents
            Loop

            '获取单个产品的链接
            n = 0
            arrTMP = Split(.responseText, Chr(34) & " target=" & Chr(34) & "_blank" & Chr(34) & " title=")  '" target="_blank" title=
            ReDim arrEVE(1 To UBound(arrTMP) / 2 + 1)
            For j = 1 To UBound(arrTMP) Step 2
                n = n + 1
                arrEVE(n) = Split(arrTMP(j), "<a href=" & Chr(34))(UBound(Split(arrTMP(j), "<a href=" & Chr(34))))
            Next
            
            If Worksheets("TB").PICTX.text = "ONE" Then
                '取小图同时变大图
                arrTMP = Split(.responseText, "data-ks-lazyload=")
                ReDim arrSMPIC(1 To UBound(arrTMP))
                ReDim arrBGPIC(1 To UBound(arrTMP))
                n = 0
                For j = 1 To UBound(arrTMP)
'                    Application.StatusBar = "正在提取第 " & tts & " 个小图"
'                    arrSMPIC(j) = Replace(Split(arrTMP(j), " src=")(0), Chr(34), "")
'                    .Open "GET", arrSMPIC(j), True
'                    .Send
'                    Do Until .readyState = 4
'                        DoEvents
'                    Loop
'
'                    pic = .responseBody
'                    Call WriteBinary(ThisWorkbook.path & "\TAOBAO\small_" & tts & ".jpg", pic)
                    
                    
                    Application.StatusBar = "正在提取第 " & tts & " 张大图"
                    arrBGPIC(j) = Split(Replace(Split(arrTMP(j), " src=")(0), Chr(34), ""), "jpg_")(0) & "jpg"
                    .Open "GET", arrBGPIC(j), True
                    .Send
                    tm = Timer
                    Do Until .readyState = 4 Or Timer - tm > 12
                        DoEvents
                    Loop
                    
                    If .status = 200 Then
                        pic = .responseBody
                        Call WriteBinary(ThisWorkbook.path & "\" & arrNML(1, TP) & "\big_" & tts & ".jpg", pic)
                    End If
                    
                    tts = tts + 1
                Next
            ElseIf Worksheets("TB").PICTX.text = "ALL" Then
                '使用IE方法打开单个产品,以获取产品代码,最终取得图片
                ReDim arrPIC(1 To n, 0 To 10)
                For j = 1 To n
                    Application.StatusBar = "正在打开第 " & tt & " 个宝贝"
                    With ie
                        .Visible = False
                        .navigate arrEVE(j)
                        tm = Timer
                        Do Until .readyState = 4 Or Timer - tm > 20
                            DoEvents
                        Loop
                        
                        If .readyState = 4 Then
                            rawDT = .document.Body.innerHTML
                        Else
                            rawDT = ""
                        End If
                        
                        '此段抓取相关数据,但页面内容在变,可能抓取失败
    '                    With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")    '得到的字符串放入剪贴板,记事本观察数据
    '                        .SetText rawDT                                                    '数据正常显示,可以提取了
    '                        .PutInClipboard
    '                    End With
    '
    '                    arrCONTT(1, 1) = Split(Split(rawDT, "tb-metatit" & Chr(34) & ">")(1), "</dt>")(0)
    '                    arrCONTT(1, 2) = Split(Split(rawDT, "tb-metatit" & Chr(34) & ">")(2), "</dt>")(0)
    '                    arrCONTT(1, 3) = Split(Split(rawDT, "tm-label" & Chr(34) & ">")(1), "</p>")(0)
    '                    arrCONTT(1, 4) = Split(Split(rawDT, "tm-label" & Chr(34) & ">")(2), "</p>")(0)
    '                    arrCONTT(1, 5) = "链接"
    '
    '                    arrCONTT(2, 1) = Split(Split(rawDT, "tm-price" & Chr(34) & ">")(1), "</span>")(0)
    '                    arrCONTT(2, 2) = Split(Split(rawDT, "tm-price" & Chr(34) & ">")(2), "</span>")(0)
    '                    arrCONTT(2, 3) = Split(Split(rawDT, "tm-count" & Chr(34) & ">")(1), "</p>")(0)
    '                    arrCONTT(2, 4) = Split(Split(rawDT, "tm-count" & Chr(34) & ">")(2), "</p>")(0)
    '                    arrCONTT(2, 5) = arrEVE(j)
    '
    '                    row = Worksheets("TB").Range("E65536").End(3).row + 1
    '                    If arrCONTT(1, 1) <> "" Then
    '                        For k = 1 To 5
    '                            Cells(row, k) = arrCONTT(2, k)
    '                        Next
    '                    End If
                    End With
                    
                    If rawDT <> "" Then
                        '取出全部大图所在的链接
                        arrTMP = Split(rawDT, Chr(34) & " data-hasZoom")
                        arrPIC(j, 0) = Split(arrTMP(0), "src=" & Chr(34))(UBound(Split(arrTMP(0), "src=" & Chr(34))))   '主图
   
                        arrPICT = Split(arrTMP(1), "<a href=" & Chr(34) & "#" & Chr(34) & "><img src=" & Chr(34))
                        For k = 1 To UBound(arrPICT)
                            arrPIC(j, k) = Split(arrPICT(k), "jpg_")(0) & "jpg"
                        Next

                        '打开图片链接
                        For k = 1 To UBound(arrPIC, 2)
                            If arrPIC(j, k) <> "" Then
                                Application.StatusBar = "正在提取第 " & tt & "_" & k & " 张图片"
        
                                .Open "GET", arrPIC(j, k), True
                                .Send
                                tm = Timer
                                Do Until .readyState = 4 Or Timer - tm > 15
                                    DoEvents
                                Loop
                                
                                If .status = 200 Then
                                    pic = .responseBody
                                    Call WriteBinary(ThisWorkbook.path & "\" & arrNML(1, TP) & "B\" & i & "_" & tt & "_" & k & ".jpg", pic)
                                End If
                            Else
                                Exit For
                            End If
                        Next
                        tt = tt + 1
                    End If
                Next     这就是你的代码       Option Explicit

Private Sub CONFIRMBT_Click()
    TP = Split(TYPECB.text, " ")(0)
    PROD.Hide
End Sub

Private Sub TYPECB_Change()

End Sub

Private Sub UserForm_Activate()
    Dim i&
    TYPECB.ListRows = UBound(arrNML, 2)
    For i = 1 To UBound(arrNML, 2)
        TYPECB.AddItem (i & " " & arrNML(1, i))
    Next
End Sub
   

TA的精华主题

TA的得分主题

发表于 2014-12-20 15:10 | 显示全部楼层
likeslh 发表于 2014-8-11 14:36
增加搜索功能,搜索产品名称,可获取全部结果的图片。

Mark一下。

TA的精华主题

TA的得分主题

发表于 2015-5-2 17:50 | 显示全部楼层
xiaohan235890 发表于 2014-12-20 14:09
Option Explicit

Public TP%

老师。可以做个抓取淘宝爱逛街的用户分享宝贝的类目排名和活动排名吗,还有就是爱逛街主题活动查询吗【爱逛街网】http://guang.taobao.com/?spm=a310p.7395723_1.1998042884.1.8I39lj
   提取用户所选分类下的所有分享宝贝排名,分享宝贝标题,分享宝贝的分享理由

爱4.jpg
爱3.jpg
爱2.jpg
爱1.jpg

TA的精华主题

TA的得分主题

发表于 2018-3-1 11:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢分享!

TA的精华主题

TA的得分主题

发表于 2019-8-17 10:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢分享,辛苦了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 10:36 , Processed in 0.034739 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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