Невозможно повторно использовать один и тот же драйвер между двумя подпрограммами - PullRequest
1 голос
/ 16 марта 2019

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

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

Рабочий (с использованием одного саба):

Sub FetchLinks()
    Const link$ = "https://stackoverflow.com/questions/tagged/web-scraping"
    Dim driver As New ChromeDriver, post As Object
    Dim itmLink As Variant, R&, iDic As Object
    Set iDic = CreateObject("Scripting.Dictionary")

    With driver
        .get link
        For Each post In .FindElementsByCss(".summary .question-hyperlink", timeout:=10000)
            iDic(post.Attribute("href")) = 1
        Next post

        For Each itmLink In iDic.keys
            driver.get itmLink
            Debug.Print .FindElementByCss("h1 > a.question-hyperlink").Text
        Next itmLink
    End With
End Sub

Невозможно заставить его работать (попытался передать драйвер в другой сабвуфер для повторного использования):

Sub FetchLinks()
    Const link$ = "https://stackoverflow.com/questions/tagged/web-scraping"
    Dim driver As New ChromeDriver, post As Object

    With driver
        .get link
        For Each post In .FindElementsByCss(".summary .question-hyperlink", timeout:=10000)
            FetchData driver, post.Attribute("href")
        Next post
    End With
End Sub

Sub FetchData(ByRef driver, ByRef nlink As String)
    Dim elem As Object

    With driver
        .get nlink
        Debug.Print .FindElementByCss("h1 > a.question-hyperlink").Text
    End With
End Sub

Как я могу разделить chromedriver между двумя подпрограммами, чтобы очистить некоторый контент от внутренних страниц?

1 Ответ

1 голос
/ 16 марта 2019

Вы получите устаревшую ссылку на элемент, как и во внутреннем подпункте, который вы перемещаетесь от целевой страницы. Затем вы пытаетесь продолжить ссылаться на эту страницу во внешнем цикле. Поместите ссылки в словарь и зациклите это. Также передайте ByVal.

Option Explicit

Public Sub FetchLinks()
    Const link$ = "https://stackoverflow.com/questions/tagged/web-scraping"
    Dim driver As ChromeDriver, post As Object, key As Variant
    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary"): Set driver = New ChromeDriver
    With driver
        .get link

        For Each post In .FindElementsByCss(".summary .question-hyperlink", timeOut:=10000)
            dict(post.Attribute("href")) = 1
        Next
        For Each key In dict.keys
            FetchData driver, key
        Next key
    End With
End Sub

Public Sub FetchData(ByVal driver As ChromeDriver, ByVal nlink As String)
    With driver
        .get nlink
        Debug.Print .FindElementByCss("h1 > a.question-hyperlink").Text
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...