#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'}]