Bir perakendecinin web sayfasından ürün bilgilerini almak için bir makro yazdım. İyi çalışıyor ancak çalışma sayfamda hiç sonuç vermiyor. Nedenini anlamakta zorlanıyorum. Aşağıdaki url yol arama inputbox içine "satış" girin: Ürün adı ve fiyatlandırma verilerini VBA'da getelementsbyclassname kullanarak çevrimiçi bir perakendecinin web sayfasından nasıl tarayabilirim?
http://www.shopjustice.com/search/?q=sale&originPageName=home
Ben ürünün adı, eski fiyat, ve benim çalışma sayfasında güncel fiyatı istiyorum. aşağıdaki gibi bu unsurlar için HTML şu şekildedir:<div class="subCatName">
<a href="/girls-clothing/colored-jeggings/6611358/651?pageSort=W3sidHlwZSI6InJlbGV2YW5jZSIsInZhbCI6IiJ9XQ==&productOrigin=search%20page&productGridPlacement=1-1" id="anchor2_6611358" class="auxSubmit">Colored Jeggings</a>
</div>
<div class="cat-list-price subCatPrice">
<div class="priceContainer">
<span class="mobile-was-price">
was
$26.90</span>
<span class="mobile-now-price">
now
$10.49</span>
</div>
<div class="price_description">
<span class="mobile-extra">
Extra 30% off clearance!</span>
</div>
</div>
kodudur:
Sub test2()
Dim RowCount, erow As Long
Dim sht As Object
Dim ele As IHTMLElement
Dim eles As IHTMLElementCollection
Dim doc As HTMLDocument
Set sht = Sheets("JUSTICESALE")
RowCount = 1
sht.Range("A" & RowCount) = "Clothing Item"
sht.Range("B" & RowCount) = "SKU"
sht.Range("C" & RowCount) = "Former Price"
sht.Range("D" & RowCount) = "Sale Price"
Set ie = CreateObject("InternetExplorer.application")
searchterm = InputBox("ENTER SEARCH TERM")
Application.StatusBar = "LOADING JUSTICE SEARCH"
With ie
.Visible = True
.navigate "http://www.shopjustice.com/"
Do While .busy Or _
.readystate <> 4
DoEvents
Loop
Set doc = ie.document
doc.getelementsbyname("q").Item.innertext = searchterm
doc.getElementsByClassName("searchbtn").Item.Click
Application.StatusBar = "EXTRACTING PRODUCT DATA"
Set eles = doc.getElementsByClassName("subCatName")
For Each ele In eles
If ele.className = "subCatName" Then
erow = sht.Cells(Rows.count, 1).End(xlUp).Offset(1, 0).Row
Cells(erow, 1) = doc.getElementsByClassName("auxSubmit")(RowCount).innertext
Cells(erow, 2) = doc.getElementsByClassName("mobile-was-price")(RowCount).innertext
RowCount = RowCount + 1
End If
Next ele
End With
Set ie = Nothing
Application.StatusBar = ""
End Sub
Herhangi bir yardım çok takdir edilecektir.
EDIT: Merhaba Peter, içgörünüzü takdir ediyorum. Kesinlikle bazı problemleri önceden boşaltmıştır. Ancak, aşağıdaki kod, hesaptan-için-eksik-classname döngüsünden önce eklendikten sonra, yine de excel'e yazmıyor.
Do While ie.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
Neyi eksik?
Farklı bir perakendeci web sayfası için, aşağıda gösterildiği gibi aynı konsepti de içeren alternatif bir yöntem oluşturdum. Bu yöntemle ilgili düşünceleriniz nelerdir? Tek sorunum, Select Case satırında bir İzin Reddedildi Hatası 70'tir.
Sub test5()
Dim erow As Long
Dim ele As Object
Set sht = Sheets("CARTERS")
RowCount = 1
sht.Range("A" & RowCount) = "Clothing Item"
sht.Range("B" & RowCount) = "SKU"
sht.Range("C" & RowCount) = "Former Price"
sht.Range("D" & RowCount) = "Sale Price"
erow = Sheet1.Cells(Rows.count, 1).End(xlUp).Offset(1, 0).Row
Set objIE = CreateObject("Internetexplorer.application")
searchterm = InputBox("ENTER CARTER'S SEARCH TERM")
With objIE
.Visible = True
.navigate "http://www.carters.com/"
Do While .Busy Or _
.readyState <> 4
DoEvents
Loop
.document.getElementsByName("q").Item.innerText = searchterm
.document.getElementsByClassName("btn_search").Item.Click
Do While .readyState <> READYSTATE_COMPLETE
DoEvents
Loop
For Each ele In .document.all
Select Case ele.className
Case “product - name”
RowCount = RowCount + 1
sht.Range("A" & RowCount) = ele.innerText
Case “product - standard - price”
sht.Range("B" & RowCount) = ele.innerText
Case "product-sales-price"
sht.Range("C" & RowCount) = ele.innerText
End Select
Next ele
End With
Set objIE = Nothing
End Sub
Ve bir kez daha, yardımlarınız için teşekkür ederim.
çünkü döngü içinde unsurlarından biri ('ele' değişken bir amacı, hatırlamak kodunuzda belirtilmemiş tür) '.ClassName' özelliği yoktur. Bu yüzden hala bu tür hata işlemlerini hesaba katmanız gerekecek. Ayrıca sayfadaki tüm öğeler arasında geçiş yapmak istediğiniz gibi görünüyor. Tamamen iyi, ama bir elemanın çocuk sahibi olup olmadığını tespit etmeyi unutmayın, o zaman bu elemanlara da dönmelisiniz. (Eşyaların tüm ek sayfalarını da kazıyarak almayı unutmayın.) – PeterT
PeterT, "bir öğenin çocuk sahibi olup olmadığını algılamayı" yazdı. Bir elemanın çocuk sahibi olup olmadığını nasıl tespit edersiniz. Teşekkürler. – Cymro