Поиск элемента на веб-странице - Rselenium / rvest - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь собрать все отдельные URL-адреса (URL-адрес адвоката) с этого веб-сайта - https://www.linklaters.com/en/find-a-lawyer. Я не могу найти способ извлечь URL-адреса - когда я использую селектор CSS, он не работает. Не могли бы вы предложить другой способ найти конкретный элемент на веб-странице? Также для сбора всех данных мне нужно нажать на кнопку «Загрузить еще» и я использую RSelenium. Я думаю, что я не делаю что-то правильно с запуском Rselenium через Docker, так как появляется ошибка - Ошибка в checkError (res): Неопределенная ошибка в вызове httr. Вывод httr: не удалось подключиться к локальному порту 4445: соединение отклонено

library(dplyr)
library(rvest)
library(stringr)
library(RSelenium)

link = "https://www.linklaters.com/en/find-a-lawyer"
hlink = read_html(link)
urls <- hlink %>%
        html_nodes(".listCta__subtitle--top") %>%
        html_attr("href")
urls <- as.data.frame(urls, stringsAsFactors = FALSE)
names(urls) <- "urls"

remDr <- RSelenium::remoteDriver(remoteServerAddr = "localhost",
                                 port = 4445L,
                                 browserName = "chrome")
remDr$open()

replicate(20,
          {       # scroll down
                  webElem <- remDr$findElement("css", "body")
                  webElem$sendKeysToElement(list(key = "end"))
                  # find button
                  allURL <- remDr$findElement(using = "css selector", ".listCta__subtitle--top")
                  # click button
                  allURL$clickElement()
                  Sys.sleep(6)
          })

allURL <- xml2::read_html(remDr$getPageSource()[[1]])%>%
        rvest::html_nodes(".field--type-ds a") %>%
        html_attr("href")

1 Ответ

0 голосов
/ 10 ноября 2018

Это просто загрузка динамических данных по запросам XHR. Просто возьмите прекрасный JSON:

jsonlite::fromJSON("https://www.linklaters.com/en/api/lawyers/getlawyers")
jsonlite::fromJSON("https://www.linklaters.com/en/api/lawyers/getlawyers?searchTerm=&sort=asc&showing=30")
jsonlite::fromJSON("https://www.linklaters.com/en/api/lawyers/getlawyers?searchTerm=&sort=asc&showing=60")
jsonlite::fromJSON("https://www.linklaters.com/en/api/lawyers/getlawyers?searchTerm=&sort=asc&showing=90")

Продолжайте увеличивать на 30 до тех пор, пока не вернется ошибочный результат, предпочтительно с задержкой в ​​5 с между запросами, чтобы не сбиться с толку.

...