2017-11-01 481 views
5

Bir web sayfası tam olarak yüklenene kadar kodu duraklatmak için, aşağıdaki yöntemi hemen hemen her zaman büyük bir başarı ile kullanıyorum. yöntem Sayfa tamamen yüklenir ve böylece bu içerik çıkarılan olmadığını belirlerse sonraExcel VBA'da, web sayfasının tam olarak yüklenip yüklenmediğini kontrol etmenin yolu nedir?

Do While objIE.Busy = True Or objIE.readyState <> 4: DoEvents: Loop 

Ama bazen, ben metin içeriği yükü görüyoruz. Bununla birlikte, F8 yoluyla koddan geçersem, içerik her seferinde ayıklanır. Bununla birlikte, F8 yoluyla koddan geçersem, içerik her seferinde çıkarılır. Bu, F8 tuşuna art arda basabildiğim kadar hızlı yapılır.

Kodun verileri ayıklamaya devam etmeden önce sayfanın ve tüm içeriğinin tam olarak yüklenmesini sağlamak için nasıl denetleyebilirim?

Her iki durumda da, IE görünmez biçimde çalışıyor. Bununla birlikte, bunu IE ile görünürde denedim ve çalıştığım sayfalarda aslında bu özel konumdaki içerik var.

Bu, Excel 2016'da VBA komut dosyası kullanılarak gerçekleştiriliyor. belirli içerik isteği gibi yazılır:

Ben belge yüklendikten sonra belki değerleri veri kazıma kimse önlemek amacıyla, eklenmeye olduğunu düşünüyorum çünkü ben Excel VBA: Wait for JavaScript execution in Internet Explorer baştan sona kadar okuduktan
'get item name from page and write it to the first cell on the first empty row available 
Set itemName = objIE.document.querySelector(".the-item-name") 
Worksheets("Results").Range("A1048576").End(xlUp).Offset(1, 0).Value = itemName.innerText 

. Ancak, bunu yapan herhangi bir betiği tanımlayamıyorum. Orada olmadığı anlamına gelmez. Henüz göremiyorum. -/each: Bu istek dönecektir ne nedenle, fiyat öncesinde yüklenen (-)

bu konuyla sayfanın özel bir örneği Başlangıçta product-total-price div elemanı çizgi içeren

https://www.homedepot.ca/en/home/p.dry-cloth-refills-32---count.1000660019.html

URL

olduğunu $11.29/each yerine.

Bir geçici çözümüm var, ancak olmasını istediğim kadar verimli veya kısa değil. Çizginin varlığı için döndürülen ipi test ediyorum. Eğer varsa, döngü yapın ve tekrar kontrol edin, başkalarını yakalayın ve çalışma sayfasına ekleyin.

setPriceUM: 
    Set hdPriceUM = objIE.document.querySelector(".product-total-price").innerTe‌​‌​xt 
    hdPriceUMString = hdPriceUM.innerText 
    stringTest = InStr(hdPriceUMString, "-") 
    If stringTest = True Then 
     GoTo setPriceUM 
    Else 
     Debug.Print hdPriceUMString 
    End If 

Bunu okumak için zaman ayırdığınız ve düşündüğünüz için teşekkür ederiz.

+1

Mükemmel bir soru. Bu konuyla da mücadele ediyorum ama neyse ki, her zaman problemimi çözdüğüm bir yol, nesnem kullanılabilir hale gelene kadar, döngü. Yani, sorum şu: sayfa tamamen "yüklendikten" sonra tüm nesneleriniz var mı? Örnek: Set SubmitBtn = doc.getElement ..... '...' 'Nothing' 'bir çalışma zamanı hatası mı veriyor? –

+0

Bu soruna da girdim, ancak genellikle bir ağ sorunudur. Ağ hızlı çalışıyorsa, sorun yok, ancak biraz gecikme süresi göstermeye başladığında, sayfalar tam olarak yüklenmiyor. Fazla zamana izin vermek için bekleme zamanlayıcısı eklemeye başvurmak zorunda kaldım. 'Application.Wait (Now + TimeValue (" 0:00:06 "))' Bu 6 saniyelik bir bekleme. – Mitch

+0

@Mitch Timers, özellikle yavaş ağ için güvenilir olmayan bir çözümdür. – omegastripes

cevap

1

Web sayfalarının işlevselliği çok farklı, bu nedenle hepsine uygun bir çözüm bulunmuyor. , Sen web sayfası yükleme işlemi, XHR'ler ve DOM modifikasyonlar içine bakmak gerekir Neyse

Sub TestIE() 

    Dim q 

    With CreateObject("InternetExplorer.Application") 
     .Visible = True 
     .Navigate "https://www.homedepot.ca/en/home/p.dry-cloth-refills-32---count.1000660019.html" 
     ' Wait IE 
     Do While .readyState < 4 Or .Busy 
      DoEvents 
     Loop 
     ' Wait document 
     Do While .document.readyState <> "complete" 
      DoEvents 
     Loop 
     ' Wait element 
     Do 
      q = .document.querySelector(".product-total-price").innerText 
      If Left(q, 1) <> "-" Then Exit Do 
      DoEvents 
     Loop 
     .Quit 
    End With 
    Debug.Print q 

End Sub 

(tarayıcı geliştirici araçlarını kullanarak,: gibi örneğin İlişkin

, sizin geçici bir çalışma çözümdür, kod olabilir F12). Bu şekilde giderken, çok sayıda XHR'den birinin fiyatı JSON biçiminde döndürdüğünü görebilirsiniz. Sayfa yüklenirken fiyatın görünmesinden hemen önce tarayıcı geliştirici araçlarının ağ sekmesinde oturum açtı. Bu XHR, yüklenen JS'den biri tarafından, özellikle sayfa yüklenen olaydan sonra yapılır.

https://www.homedepot.ca/homedepotcacommercewebservices/v2/homedepotca/products/1000660019/localized/9999?catalogVersion=Online&lang=en

Yani sadece o xhr çoğaltabilir ve bölerek fiyatı ayıklamak: (Sadece ağ sekmesinden kopyalanmış) Bu URL'yi deneyin

Sub TestXHR() 

    Dim q 

    With CreateObject("MSXML2.XMLHTTP") 
     .Open "GET", "https://www.homedepot.ca/homedepotcacommercewebservices/v2/homedepotca/products/1000660019/localized/9999?catalogVersion=Online&lang=en", False 
     .Send 
     q = .ResponseText 
    End With 
    q = Replace(q, " : ", ":") 
    q = Split(q, """displayPrice""", 2)(1) 
    q = Split(q, """formattedValue"":""", 2)(1) 
    q = Split(q, """", 2)(0) 
    Debug.Print q 

End Sub 

Ama yine, hiçbir ortak yoktur vaka.

+0

Omegastripes, ilk kod snippet'inde yaptığınız şey neredeyse benim çözümümle özdeştir, bu yüzden kodlama kalitemizin geldiğini bana teşvik ediyor. XHR benim için yeni-ish ve ben yaklaşık 15 yıl önce ortaya çıktığı için herhangi bir JSON çalışması yapmadım. Her ikisine de hız vereceğim. Geçen hafta MSXML2.XMLHTTP işlevine bakmaya başladım. Bunun doğru olduğuna inanıyorum. İşe gidip, rapor vereceğim. Teşekkür ederim! – Innertube