Web Scraping - инциденты COVID19 - PullRequest
0 голосов
/ 31 марта 2020

У меня есть несколько вопросов по поводу программы Excel VBA, которую я хочу построить.

В принципе, это довольно просто. Я хочу получить доступ к следующему веб-сайту https://coronavirus.jhu.edu/map.html и извлечь «Подтвержденные случаи» по стране / региону / суверенитету (это таблица в левой части панели инструментов) и вставить значения в excel.

Я знаю все основы c о том, как настроить экземпляр internetexplorer и очистить страницу по тегам, классам, идентификаторам и т. Д. c. Но я думаю, что в этом sceanrio я не могу использовать основные вещи c. Я думаю, это довольно сложно на самом деле. Информация, которую я ищу, находится в некоторых тегах. Но я не могу получить их текстовое содержание, когда использую метод getelementsbytagname ("strong").

Может ли кто-нибудь помочь мне в этом случае?

Я благодарен за любые подсказки, советы и решения.

Ниже вы найдете начало моего кода.

Лучший Симон

 Sub test()
    Dim ie As InternetExplorer
    Dim html As HTMLDocument
    Dim i As Integer
    Dim obj_coll As IHTMLElementCollection
    Dim obj As HTMLObjectElement


    Set ie = New InternetExplorer
    ie.Visible = False


    ie.navigate "https://coronavirus.jhu.edu/map.html"

    Do Until ie.readyState = READYSTATE_COMPLETE
    DoEvents
    Loop

    Debug.Print "Successfully connected with host"
    Set html = ie.document

    Set obj_coll = html.getElementsByTagName("strong")

    For Each obj In obj_coll

    Debug.Print obj.innerText


    Next obj

    ie.Quit
    End Sub

1 Ответ

2 голосов
/ 31 марта 2020

Вы можете использовать URL-адрес iframe для навигации. Затем вам нужно время ожидания, чтобы убедиться, что данные загружены в этот iframe. Я бы тогда собирал нодлисты через более быстрые css селекторы. Поскольку нодыList (один для рисунков, а другой для местоположений) имеют одинаковую длину, вам потребуется только один l oop для индексации в обоих списках для получения строк данных.

Option Explicit

Public Sub GetCovidFigures()

    Dim ie As SHDocVw.InternetExplorer

    Set ie = New SHDocVw.InternetExplorer

    Dim t As Date
    Const MAX_WAIT_SEC As Long = 30

    With ie
        .Visible = True
        .Navigate2 "https://www.arcgis.com/apps/opsdashboard/index.html#/bda7594740fd40299423467b48e9ecf6"

        Do
            DoEvents
        Loop While .Busy Or .readyState <> READYSTATE_COMPLETE

        t = Timer
        Do
            If Timer - t > MAX_WAIT_SEC Then Exit Sub
        Loop While .document.querySelectorAll(".feature-list strong").Length = 0

        Dim figures As Object, location As Object, results(), i As Long

        Set figures = .document.querySelectorAll("h5 strong")
        Set location = .document.querySelectorAll("h5 span:last-child")

        ReDim results(1 To figures.Length, 1 To 2)

        For i = 0 To figures.Length - 1
            results(i + 1, 1) = figures.item(i).innerText
            results(i + 1, 2) = location.item(i).innerText
        Next

        .Quit
    End With

    ActiveSheet.Cells(1, 1).Resize(UBound(results, 1), UBound(results, 2)) = results
End Sub

Рассмотрим, как часто Вы хотите это. Существует большое количество API-интерфейсов, которые предоставляют эти данные, и вы могли бы вместо этого быстрее отправлять запросы xhr. Кроме того, вы можете просто взять исходные данные в виде csv из github здесь . * Файлы после 1 февраля (UT C): один раз в день около 23:59 (UT C). На вкладке сети инструментов разработчика виден API отдыха, который часто предоставляет новые данные в формате json, который используется для обновления страницы. К ним можно получить доступ, например, через Python + запросы или R + httr. Я подозреваю, что эта конечная точка не предназначена для попадания, поэтому ищите API publi c.

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