Очистить веб-страницу, когда селектор не обновляет URL - PullRequest
2 голосов
/ 18 апреля 2020

Я пытаюсь очистить эту веб-страницу (https://nc.211counts.org) для заданного региона и времени (например, «Вкл.», «Вчера»). Я хочу получить всю информацию из этой верхней левой таблицы (COVID, Housing, et c через Other). К сожалению, URL не обновляется при выборе фильтров. Я следовал учебному пособию здесь , но не могу найти способ выдвинуть в позицию названия регионов, которые мне нужно почистить. Поскольку функция html_nodes возвращает пустое значение, я думаю, что в отображении есть что-то, что отключено.

Что мне здесь не хватает?

# docker run -d -p 4445:4444 selenium/standalone-chrome
# docker ps

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

remDr$navigate("https://nc.211counts.org") 
remDr$screenshot(display = TRUE) 
nc211 <- xml2::read_html(remDr$getPageSource()[[1]]) 

str(nc211)

body_nodes <- nc211 %>% 
  html_node('body') %>% 
  html_children()

body_nodes

body_nodes %>% 
  html_children()

rank <- nc211 %>% 
  rvest::html_nodes('body') %>% 
  xml2::xml_find_all("//span[contains(@class, 'col-lg-12 chosen-select')]") %>% 
  rvest::html_text()

# this returns empty
nc211 %>%
  rvest::html_nodes("#region") %>%
  rvest::html_children() %>%
  rvest::html_text() 

# guessing at an element number to see what happens
element<- remDr$findElement(using = 'css selector', "#region > option:nth-child(1)")
element$clickElement()

1 Ответ

1 голос
/ 18 апреля 2020

Содержимое динамически обновляется с помощью запросов xhr POST, когда вы делаете свой выбор и нажимаете Поиск. Вы можете использовать вкладку сети, чтобы анализировать эти запросы и воспроизводить их, не прибегая к селену (в качестве альтернативы). Вам нужно будет выбрать параметры параметров с начальной страницы.

enter image description here

Ниже я покажу вам, как сделать запрос на определенный почтовый индекс, а также как узнать все почтовые индексы и соответствующие им параметры для использовать в запросе. Последний должен исходить из исходного URL.

library(httr)
library(rvest)


data = list(
  'id' = '{"ids":["315"]}', # zip 27006 is id 315 seen in value attribute of checkbox node 
  'timeIntervalId' = '18',
  'centerId' = '7',
  'type' = 'Z'
)
#post request that page makes using your filter selections e.g. zip code
r <- httr::POST(url = 'https://nc.211counts.org/dashBoard/barChart',  body = data) 
page <- read_html(r)
categories <- page %>% html_nodes(".categoriesDiv  .toolTipSubCategory, #totalLabel") %>% html_text
colNodes <- page %>% html_nodes(".categoriesDiv .value")
percentages <- colNodes %>% html_attr('data-percentage')
counts <- colNodes %>% html_attr('data-value')

df <- as.data.frame(cbind(categories, percentages, counts)) 
print(df)

#Lookups e.g. zip codes. Taken from initial url
initial_page <- read_html('https://nc.211counts.org/')
ids <- initial_page %>% html_nodes('.zip [value]') %>% html_attr('value')
zips <- initial_page %>% html_nodes('.zip label') %>% html_text() %>% trimws()

print(ids[match('27006', zips)])
...