Как рассчитать задержку загрузки URL-адреса и возобновить загрузку следующего URL-адреса в строке, используя VBA - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть список из 50 URL-ссылок в столбце Excel.Я извлекаю свои данные, но есть случай, когда URL делает тайм-аут, я думаю, потому что на веб-странице есть фотографии высокой четкости.Это одна из ссылок

https://www.wavemotion.gr/el/shop/smartphone-accessories/itap-magnetic-air-vent-car-mount

Как перейти на следующий URL, если задержка загрузки превышает 10 секунд?Пока у меня есть следующее

'Set Worksheet
Set wks = wb.Sheets("wavemotion")
'Limit rows
lastrow = wks.Cells(Rows.Count, "B").End(xlUp).Row
'Set IE display
ie.Visible = True


For i = 2 To lastrow

mylink = wks.Cells(i, 2).Value

ie.Navigate mylink

Const MAX_WAIT_SEC As Long = 5


While ie.Busy Or ie.ReadyState < 4: DoEvents: Wend
t = Timer
Do
    DoEvents
    On Error Resume Next
'change row color           
    wks.Range(Cells(i, 1), Cells(i, 5)).Interior.ColorIndex = 38

    Set product_sku = ie.Document.querySelector(".single-product__sku")
    wks.Cells(i, "A").Value = product_sku.innerText

    Set price = ie.Document.querySelector(".price .woocommerce-Price-amount")
    wks.Cells(i, "E").Value = price.innerText

    Set availability = ie.Document.querySelector(".stock.in-stock ")
    Set availability = ie.Document.querySelector(".stock.out-of-stock ")
    Set availability = ie.Document.querySelector(".stock.out-of-stock ")

    wks.Cells(i, "D").Value = availability.innerText

    Set product_name = ie.Document.querySelector(".single-product__title")
    wks.Cells(i, "C").Value = product_name.innerText

    'Set product_color = ie.Document.querySelector(".single-product__colors__label ")
    'wks.Cells(i, "G").Value = product_color.innerText


    If Timer - t > MAX_WAIT_SEC Then Exit Do
    On Error GoTo 0
Loop
If price Is Nothing Then Exit Sub

wks.Range(Cells(i, 1), Cells(i, 5)).Interior.ColorIndex = 0

Next i

ie.Quit
Set ie = Nothing

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Я бы расширил Const, поскольку именно там должно быть определено время ожидания.Затем реорганизуйте свой код, чтобы вы могли выйти раньше, если сможете установить целевой элемент.Проверить элемент «Ничего нет» в элементе «Set» и выполнить только следующие строки (связанные с этим URL-адресом), если параметр «Нет, ничто».

Мне немного неловко из-за структуры навигации в цикле, и я хотел бы проверить,у вас есть какие-либо URL, которые вы знаете, повесить.Как я сейчас добавил, установив элемент и перейдя в тот же блок, вы можете добавить еще одну секунду или две к Const.

Option Explicit   
Public Sub test()
    Const MAX_WAIT_SEC As Long = 10
    'other code
    Set wks = wb.Sheets("wavemotion")
    LastRow = wks.Cells(Rows.Count, "B").End(xlUp).Row

    ie.Visible = True

    For i = 2 To LastRow

        mylink = wks.Cells(i, 2).Value        
        t = Timer
        Do
            DoEvents          
            ie.Navigate2 mylink

            While ie.Busy Or ie.readyState < 4: DoEvents: Wend

            On Error Resume Next
            Set availability = ie.document.querySelector(".stock.in-stock ")
            On Error GoTo 0
            If Timer - t > MAX_WAIT_SEC Then Exit Do
        Loop While availability Is Nothing

        If Not availability Is Nothing Then

            wks.Range(Cells(i, 1), Cells(i, 5)).Interior.ColorIndex = 38
            Set product_sku = ie.document.querySelector(".single-product__sku")
            wks.Cells(i, "A").Value = product_sku.innerText
            Set price = ie.document.querySelector(".price .woocommerce-Price-amount")
            wks.Cells(i, "E").Value = price.innerText
            wks.Cells(i, "D").Value = availability.innerText
            Set product_name = ie.document.querySelector(".single-product__title")
            wks.Cells(i, "C").Value = product_name.innerText
            Set product_color = ie.document.querySelector(".single-product__colors__label ")
            wks.Cells(i, "G").Value = product_color.innerText
            wks.Range(Cells(i, 1), Cells(i, 5)).Interior.ColorIndex = 0
            Set price = Nothing: Set availability = Nothing '.... etc
        End If
    Next i

    ie.Quit
    Set ie = Nothing
End Sub
0 голосов
/ 19 декабря 2018

Я бы посоветовал вам поменять чек, если страница загружена.В моем коде время, необходимое для загрузки, выходит из цикла через 10 секунд.

Я добавил логическое значение, которое изменяется на false, если прошло более 10 секунд.Позже это используется в операторе if, чтобы проверить, следует ли запускать остальную часть кода.

t = Timer
booLoaded = true

Do While ie.Busy Or ie.ReadyState < 4

  DoEvents

  If Timer - t > 10 Then
    booLoaded = false
    Exit Do
    t = ""
  end if

loop

t = timer

if booload = true then
   Do
   DoEvents
'... rest of the do loop here
end if

next i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...