我正在尝试构建一个 Shiny 应用程序来跟踪疫苗进度,因为 CDC page 不保留历史信息。查看使用 Chrome DevTools 的页面代码,我可以看到我想从每个 <div>
标签中提取信息,类为 "card-content"
,我尝试使用以下代码使用 rvest
包:
data <- read_html('https://covid.cdc.gov/covid-data-tracker/#vaccinations')
current_numbers <- data %>% html_nodes('div.card-content')
这将返回一个结构为“List of 0”的空对象。
我还使用 readr::read_file
生成了一个 .txt 文件,以查看是否发生了一些奇怪的事情。它返回了一个带有
<main id="maincontent">
</main>
并且没有中间内容,尽管页眉和页脚代码似乎都在那里。
是否有更好的方法从页面上的 <main>
内容中提取数据? rvest
是适合这个的包吗?我也可以在 Python 中尝试 bs4
,但不知道如何利用它制作 Shiny 应用程序。
答案 0 :(得分:1)
网站正在处理动态内容,因此您不会通过这种方式获得任何信息。
我对 r
的了解不是很深,但正如你提到的 python
和 bs4
,我可以给你一个小例子。
示例
from selenium import webdriver
from bs4 import BeautifulSoup
from time import sleep
driver = webdriver.Chrome(executable_path='C:\Program Files\ChromeDriver\chromedriver.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'}]