Очистить все содержимое веб-страницы

#r #web-scraping #rvest

#r #очистка веб-страницы #rvest

Вопрос:

Я пытаюсь создать блестящее приложение для отслеживания прогресса вакцинации, поскольку страница CDC не сохраняет историческую информацию. Просматривая код страницы с помощью Chrome DevTools, я вижу, что хочу извлекать информацию из каждого <div> тега с помощью class "card-content" , что я попытался сделать со следующим кодом, используя rvest пакет:

 data <- read_html('https://covid.cdc.gov/covid-data-tracker/#vaccinations')
current_numbers <- data %>% html_nodes('div.card-content')
 

Это возвращает пустой объект со структурой «Список 0».

Я также использовал readr::read_file для создания файла .txt, чтобы посмотреть, происходит ли что-то странное. Он вернул файл с

     <main id="maincontent">

    </main>
 

и никакого промежуточного содержимого, хотя код верхнего и нижнего колонтитулов, похоже, весь там.

Есть ли лучший способ извлечь данные из <main> содержимого страницы? Является rvest ли правильный пакет для этого? В качестве альтернативы я мог бы попробовать bs4 на Python, но не знаю, как сделать из этого блестящее приложение.

Ответ №1:

Веб-сайт имеет дело с динамическим контентом, поэтому вы не получите никакой информации таким образом.

Я не настолько углублен r , но, как вы упомянули python , и bs4 я мог бы привести вам небольшой рабочий пример.

Пример

 from selenium import webdriver
from bs4 import BeautifulSoup
from time import sleep

driver = webdriver.Chrome(executable_path='C:Program FilesChromeDriverchromedriver.exe')
url = "https://covid.cdc.gov/covid-data-tracker/#vaccinations"

driver.get(url)
sleep(2)

soup = BeautifulSoup(driver.page_source, "lxml")

driver.close()
[{'title': item.find('h4').get_text(), 'value': item.find('div').get_text()}  for item in soup.select('div.card-content')]
 

Вывод

 [{'title': 'Total Doses Distributed', 'value': '37.960.000'},
 {'title': 'Total Doses Administered', 'value': '17.546.374'},
 {'title': 'Number of People Receiving 1 or More Doses',
  'value': '15.053.257'},
 {'title': 'Number of People Receiving 2 Doses', 'value': '2.394.961'},
 {'title': 'Doses Administered in Long-Term Care Facilities ',
  'value': '2.089.181'}]