Gagal Scrape Data di Range

  1. ‹ Older
  2. 2 tahun lalu

    @manweljs_ @Caton

    Terima kasih mas Caton dan Man untuk terikut dalam masalah saya, hehe
    Saya coba segala cara yang saya tau dari konsep penjelasan mas di atas.
    Terima kasih sudah meberikan penjelasannya ya,

    Akan saya update di perkembangan nya disini yaa,

    Sekalli lagi terima kasih

  3. Di sunting 2 tahun lalu oleh manweljs_

    @awe

    berikut contoh skrip untuk harga lama dan harga baru, untuk status saya kurang paham yang mana yang diambil jadi silahkan dikembangkan ;)

    Sub GetFromWeb()
    Dim Ie As New InternetExplorer
    Dim Doc As HTMLDocument
    Dim lIdx As Long
    
    lIdx = Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To lIdx
        With Ie
            .Visible = False
            .navigate Cells(i, 1).Value
        Do
            DoEvents
        Loop Until .readyState = READYSTATE_COMPLETE
        
        Set xHTMLDoc = .document
        sBuffer = xHTMLDoc.body.innerHTML
        HargaLama = Chr$(34) & "list" & Chr$(34) & Chr$(58)
        HargaBaru = Chr$(34) & "final" & Chr$(34) & Chr$(58)
        Idx1 = InStr(1, sBuffer, HargaLama)
        Idx2 = InStr(1, sBuffer, HargaBaru)
    
        If Idx1 Then
          sTemp = vbNullString
          sTemp = Mid(sBuffer, Idx1 + Len(HargaLama), 50)
          sTemp = Mid(sTemp, 1, InStr(1, sTemp, Chr$(44)) - 1)
          Sheet1.Cells(i, 3) = sTemp
        End If
        If Idx2 Then
          sTemp = vbNullString
          sTemp = Mid(sBuffer, Idx2 + Len(HargaBaru), 50)
          sTemp = Mid(sTemp, 1, InStr(1, sTemp, Chr$(44)) - 1)
          Sheet1.Cells(i, 5) = sTemp
        End If
        End With
    Next i
    End Sub

    sorry ada update sedikit, pengaruh copy paste (^_^)/

  4. @manweljs_

    Terima kasih banyak Mas man, saya coba gabungkan dengan script yang ada,
    akan saya update hasilnya.
    Sekali lagi terima kasih dan mohon maaf kan saya kalau ini membuat mas pusing, hehehe

  5. @manweljs_ @Caton

    Terima kasih Saya sudah berhasil untuk mengambil harga dari script yang mas Man berikan, tetapi Yang seharusnya Stok Tersedia dan Stok Tinggal malah jadi Stok tidak tersedia
    -image-

    Jadi status Stok di website tersebut ada 3 Kondisi

    1. Stok Tersedia = dp__stock dp__stock--ready
    2. Stok tidak tersedia = dp__stock dp__stock--empty
    3. Stok Tinggal 5 / 4 / 3 / 2 / 1 = dp__stock dp__stock--limited

    Tetapi hasil pengambilan data di element tersebut (span)

    1. check_circle Stok Tersedia
    2. highlight_off Stok tidak tersedia
    3. info Stok Tinggal 5 / 4 / 3 / 2 /1

    Sehingga saya menggunakan script ini untuk menghilang kata yang gak terpakai

    'cleaning Status Stock
    ActiveCell.Replace What:="*check_circle", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    ActiveCell.Replace What:="info", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    ActiveCell.Replace What:="highlight_off", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

    Berikut script saya saat ini, dan sudah ada saya lampirkan excelnya
    Apakah saya ada menloncatkan action cek status stok dari script ini atau gimana mas?
    Mohon maaf sebelumnya untuk tanya lagi, karena saya sudah stuck, dan otak atik tidak mendapatkan hasil.

    Sub Grab()
    Dim ie As InternetExplorer
    Dim html As HTMLDocument
    Dim URLNAME As String
    Dim sht As Worksheet
    Dim LastRow As Long
    Dim stok
    Dim hargarp As String

    Set sht = ActiveSheet
    baris_akhir = sht.Cells(sht.Rows.Count, "A").End(xlUp).Row
    'MsgBox baris_akhir

    For i = 2 To baris_akhir
    URLNAME = Cells(i, 1).Value

    Set ie = New InternetExplorer
    ie.Visible = False

    ie.navigate URLNAME

    Do
    DoEvents
    Sleep 250
    Loop Until ie.readyState = READYSTATE_COMPLETE

    Set html = ie.document
    sBuffer = html.body.innerHTML
    HargaBaru = Chr$(34) & "final" & Chr$(34) & Chr$(58)
    Idx2 = InStr(1, sBuffer, HargaBaru)
    If Idx2 Then
    sTemp = vbNullString
    sTemp = Mid(sBuffer, Idx2 + Len(HargaBaru), 50)
    sTemp = Mid(sTemp, 1, InStr(1, sTemp, Chr$(44)) - 1)
    End If

    Set stok = html.getElementsByClassName("dp__stock dp__stock--ready")(0)
    'cek apakah stok banyak atau sedikit.
    If stok Is Nothing Then
    Set stok = html.getElementsByClassName("dp__stock dp__stock--limited")(0)
    Else
    End If
    If stok Is Nothing Then
    Set stok = html.getElementsByClassName("dp__stock dp__stock--empty")(0)
    Else
    End If

    'Tool sementara :
    'Debug.Print namabarang.className
    'Debug.Print namabarang.innerText
    'MsgBox statusstok

    'Harga awal
    Cells(i, 3).Select
    Cells(i, 3).Value = sTemp

    'Status Stock
    Cells(i, 4).Select
    'If statusstok.innerText = "email" Then Cells(I, 6).Value = "Stock Tersedia"
    Cells(i, 4).Value = stok.innerText

    'cleaning Status Stock
    ActiveCell.Replace What:="*check_circle", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    ActiveCell.Replace What:="info", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False
    ActiveCell.Replace What:="highlight_off", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

    ie.Quit
    Set ie = Nothing
    Application.StatusBar = ""
    On Error Resume Next

    Next i
    MsgBox "Grabing data sudah selesai boss besar, :-)", , "Box"

    End Sub

  6. Caton

    14 Nov 2018 Terverifikasi Indonesia + 16.046 Poin

    @awe ... Apakah saya ada menloncatkan action cek status stok dari script ini atau gimana mas ...

    Seperti yang saya jelaskan, jika mas @Awe mencoba mencari ke dalam elemen HTML Document, besar kemungkinan tidak akan menemukan elemen yang dicari. Sebenarnya, untuk status stok ini saya sudah kasih petunjuk pada penjelasan awal saya di atas:

    ... untuk stok barang, cari teks "in_stock" ...

    Coba perhatikan gambar berikut:

    -image-

    Periksa 2 baris di atas baris yang ditandai, ada 2 variabel data di situ, "in_stock" dan "in_limited_stock". Jadi untuk memeriksa ketersediaan stok, cukup cari teks in_stock. Nilainya berupa TRUE (tersedia) atau FALSE (tidak tersedia). Jika stok merupakan stok terbatas, maka cari teks in_limited_stock yang nilainya juga Boolean. Sedangkan jumlah stoknya, dapat mencari teks "limited_stock" dengan nilai numerik.

    Jadi, dengan konsep alur proses yang sudah saya sampaikan dan sudah diimplementasikan oleh mas @manweljs_ di atas, mas @Awe dapat mencari data yang diinginkan. Misalkan untuk status stok barang ± dicari dengan cara yang serupa:

    ...
    sKey = Chr$(34) & "in_stock" & Chr$(34) & Chr$(58)
    lPos = InStr(1, sBuffer, sKey) 
    
    If lPos Then
      sTemp = Mid(sBuffer, lPos + Len(sKey), 50)   
      sTemp = Mid(sTemp, 1, InStr(1, sTemp, Chr$(44)) - 1)
      '+-- Periksa apakah stok tersedia:
      If Cbool(sTemp) Then
        Sheet1.Cells(2, 3) = "Stok Tersedia"
      Else
        Sheet1.Cells(2, 3) = "Stok Tidak Tersedia"
      End IF
    End If
    ...

    Demikian.

  7. @manweljs_ @Caton
    Mas man dan caton terima kasih atas petunjuk dan arahan,
    Akhirnya saya sudah bisa dan menemukan semua yang saya perlukan.
    Semoga Mas Man dan Caton di berkati Tuhan dan selalu sehat jasmani, sukses terus yaa Mas,

    Salam
    Awe

  8. @awe ...Akhirnya saya sudah bisa dan menemukan semua yang saya perlukan....

    selamat ya

    jangan ragu kalo mau mampir lagi ;)

  9. @manweljs_ @Caton

    Mas mohon maaf ketemu problem lagi,
    Ada produk yang mempunyai beberapa macam variasi warna dan ukuran
    Jadi "in_stock" di body html pasti lebih dari 1.
    Kalau menggunakan Script dibawah ini, dia akan mengambil string "in_stock" pertama sedangkan setiap variasi mempunyai masing2 stok.

    sKey = Chr$(34) & "in_stock" & Chr$(34) & Chr$(58)
    lPos = InStr(1, sBuffer, sKey)

    If lPos Then
    sTemp = Mid(sBuffer, lPos + Len(sKey), 50)
    sTemp = Mid(sTemp, 1, InStr(1, sTemp, Chr$(44)) - 1)

    Contoh Barang:
    https://www.jakmall.com/computindo/cover-hujan-sepatu#2644383360843
    Barang itu mempunyai 3 Ukuran, yaitu:

    1. L
    2. XL
    3. XXL

    Link yang di tuju itu adalah ukuran XXL yang statusnya "in_stock":false
    Jadi ketika jalankan Script di atas,
    String yang di dapatkan adalah "in_stock":true

    -image-

    Saya lagi pelajari sistem karakter Chr yang bisa di aplikasikan di script saya supaya pengambilan stringnya lebih spesifik ke variasi yang kita mau.
    Tapi sampai saat ini masih belum ketemu scriptnya, sudah coba dari semalam sampai saat ini,
    Barangkali Mas sudah bisa buka jalan / petunjuk untuk saya, hehe

    Thank You
    Salam

    Awe

  10. Di sunting 2 tahun lalu oleh manweljs_

    @awe

    itu "In_stok" nya ada 4, "final" nya pun ada 4 saya jadi bingung mau diambil yang mana.

    kalo ide saya tahapannya kira-kira seperti ini :

    1. hitung ada berapa keyword "in_stok" dari sBuffer (contohnya 4)
    2. replace keyword dengan nilai atau karakter unik sebagai keyword baru, (misalnya target nya adalah "in_stok" yang ke 4 di ganti dengan "#iniTARGETNYA#"
    3. Ulangi pencarian dengan keyword baru tersebut
    4. seterusnya sama seperti sebelumnya

    namun yang pertama kali harus ditentukan adalah :
    kalau keywordnya lebih dari 1 maka yang ke berapa yang diambil

  11. @manweljs_

    Setiap produk link yang di tuju pasti punya SKU,
    "sku" itu biasa berapa 8 huruf
    Contoh b]"sku":OMTP2VBL[/b]
    -image-

    Jadi apakah bisa jika perintahnyy seperti ini:

    1. Ke link Produk
    2. Cari sku dari link produk tersebut
    3. Baru cari "in_stock" dari "sku" tersebut

    Maaf mas apakah bisa scriptnya berjalan seperti itu?

    Terima kasih mas

  12. Di sunting 2 tahun lalu oleh manweljs_

    @awe

    dari gambar diatas, "in_stock" dari "sku" tersebut = True

    bener gak ? kalo benar berarti metodenya salah, karena yang anda cari kan yang nilai = False

    bdw, SKU nya juga ada 4 :D

    SKU.PNG

  13. @manweljs_

    Mohon maaf berikut detailnya:

    Link : https://www.jakmall.com/computindo/cover-hujan-sepatu#2644383360843
    SKU : OMTP2VBL
    -image-

    Ini yang dalam html :

    -image-

    Berikut saya lampirkan script excel saat ini saya pakai

    Terima kasih

  14. @awe

    itu kan buka di chrome, kalo buka di IE muncul gak SKU nya ?

    tolong dikonfirm donk

  15. @manweljs_

    Iya kak benar tampilan website di IE tidak menampilkan SKU

  16. Di sunting 2 tahun lalu oleh awe

    @manweljs_

    Setiap belakang Link Produk ada 13 angka yang menunjukan juga sebagai sku produknya

    Contoh:

    https://www.jakmall.com/fast-n-cheap/botol-parfum-travel-size-refillable-atomizer-spray-5ml?jtm=0e28dd1fe4a54ad9a7a499afe18b96dbebe50f8d24ebebe2e54aaf393cf130eafef67f46ae20b041b345bb397cac1fc79c3f6686142e3cb1481124f1f024fa9e1efb3e62af85dae9fe90cf9cf4293a78f6515e01a63e60da5aa718fa#8030363832678
    SKU : 8030363832678

    https://www.jakmall.com/computindo/cover-hujan-sepatu#2644383360843
    SKU : 2644383360843

    https://www.jakmall.com/bajuju/sepatu-slip-on-mesh-kasual-pria?jtm=120f83c7ee21461c31dec939c811cec9ff8726352e4a3b22faa9063c1394924ca4a5481297ccc4420ed4d45cb3c6bb1915e3fddb46d55cd502157bb568fcdb40974b1bac8e82a5d779aa113852f86b8c623c55bf881f9a1a51f49fe6#5382203419298
    SKU : 5382203419298

    Ini tampilan di html bodynya:
    -image-

    Apakah bisa dari sku yang di belakang link website tersebut kita mendapatkan in_stock yang di produk itu mas sorry?

    Edit tambahin screenshot tampilan html body

  17. @awe

    saya rasa bisa :), bentar ya

  18. thank you mas @manweljs_ :)

  19. manweljs_

    16 Nov 2018 Terverifikasi Jawaban Terpilih + 9.721 Poin
    Di sunting 2 tahun lalu oleh manweljs_

    @awe

    coba skrip berikut :

    Sub GetFromWeb()
    Dim Ie As New InternetExplorer
    Dim lIdx As Long
    
    Range("c2:d300").Clear
    
    lIdx = Range("A" & Rows.Count).End(xlUp).Row
    With Ie
        For i = 2 To lIdx
        .Visible = False
        .navigate Cells(i, 1).Value
            Do
                DoEvents
            Loop Until .readyState = READYSTATE_COMPLETE
            
            sBuffer = .document.body.innerHTML
            
            'Cek SKU 13 Karakter dahulu
            SKU = Chr$(34) & Right(Sheet1.Cells(i, 1), 13) & Chr$(34) & "," & """sku""" & ":"
            SKUpos = InStr(1, sBuffer, SKU)
            If SKUpos Then
              SKU = Mid(sBuffer, SKUpos + Len(SKU), 10)
              SKU = Replace(SKU, Chr$(34), "")
            End If
            
            'Cari Posisi SKU 8 karakter
            SKUpos = 0
            SKUpos = InStr(1, sBuffer, """sku""" & ":" & Chr$(34) & SKU & Chr$(34))
            
            'Kata kunci pencarian
            xHarga = Chr$(34) & "final" & Chr$(34) & Chr$(58)
            xStok = Chr$(34) & "in_stock" & Chr$(34) & Chr$(58)
            xHargaPos = InStr(SKUpos, sBuffer, xHarga)
            xStokPos = InStr(SKUpos, sBuffer, xStok)
            
                'Harga :
                If xHargaPos Then
                  sTemp = vbNullString
                  sTemp = Mid(sBuffer, xHargaPos + Len(xHarga), 50)
                  sTemp = Mid(sTemp, 1, InStr(1, sTemp, Chr$(44)) - 1)
                  Sheet1.Cells(i, 3) = sTemp
                End If
            
                'Stok :
                If xStokPos Then
                  sTemp = vbNullString
                  sTemp = Mid(sBuffer, xStokPos + Len(xStok), 50)
                  sTemp = Mid(sTemp, 1, InStr(1, sTemp, Chr$(44)) - 1)
    
                    If sTemp = "null" Then
                      Sheet1.Cells(i, 4) = "Stok Tersedia"
                    ElseIf sTemp = "0" Then
                      Sheet1.Cells(i, 4) = "Stok tidak tersedia"
                      Else
                      Sheet1.Cells(i, 4) = "Stok Tinggal " & sTemp
                    End If
                End If
            Next i
    End With
    
    ' Note : hasilnya masih ngawur :P
    Ie.Quit
    Set Ie = Nothing
    Application.StatusBar = ""
    MsgBox "Selesai boss Awe", , "Selamat"
    End Sub

    Note : hasilnya sengaja belum sesuai harapan, silahkan di kembangkan ;)

  20. @manweljs_

    Wah petunjuk dan jalan yang terang banget
    Akhirnya sudah berhasil Mas
    terima kasih banyak Mas Man atas bantuannya.
    Mohon maaf sita waktu mas ikut dalam masalah ini
    Semoga Mas sehat selalu dan di berkati Tuhan, amin..

    Salam
    Awe

  21. 3 bulan yang lalu

    kak @awe ada script untuk shopee dan bukalapak gk yaa,,,,,
    kalau ada,,,,,,,aku mau kak hehe :)

 

atau Mendaftar untuk ikut berdiskusi!