【发布时间】:2019-07-13 19:34:12
【问题描述】:
我正在尝试从this site 创建一个包含颜色 ID、描述和日期的数据框,它通过下拉菜单输入日期和月份,并返回一个动态 JS 生成的页面。我是编码新手,并认为这将是一个有趣的玩具项目。我想使用 RSelenium 自动进行下拉选择,并使用 rvest 来抓取生成的内容。我希望的数据框结构如下所示:
description, date, meta
"paragraph about birthday", Jun 01, "DAFFODIL PANTONE 17-1512 POWERFUL KNOWING EXPRESSIVE"
我尝试首先使用 for 循环在一天中迭代一年中的每个月,然后逐步提高每个月的每一天。
我坚持简单地让循环每个月进行迭代,并获取内容。我可以先在这部分任务上使用一些概念上的帮助,并感谢任何见解!
library(RSelenium)
library(rvest)
library(tidyverse)
library(xml2)
## first run: docker run -d -p 4445:4444 selenium/standalone-chrome
## open a new connection to Chrome
remDr <- RSelenium::remoteDriver(remoteServerAddr = "localhost",
port = 4445L,
browserName = "chrome")
remDr$open()
remDr$navigate("https://www.pantone.com/pages/iphone/iphone_colorstrology.html#___1__") #Entering our URL gets the browser to navigate to the page
remDr$screenshot(display = TRUE)
#### create list of month/days
month_day<- read_html(remDr$getPageSource()[[1]])
page_i <- month_day %>%
html_nodes(".list") %>%
html_children() %>%
html_text()
months <- page_i[1:12]
months <- (paste("'", months,"'", sep=''))
days <- page_i[13:43]
days <- as.numeric(days)
## create an object for month xpath elements
for (m in months){
elements <- paste0("//option[contains(text(),",months,")]")
}
## attempt at loop
total <- data.frame()
for (e in elements){
remDr$navigate("https://www.pantone.com/pages/iphone/iphone_colorstrology.html#___1__")
print(e)
month <- remDr$findElement(using = 'xpath', e)
month$clickElement()
day <- remDr$findElement(using = 'xpath', "//select[@id='lstDay']//option[5]") ## arbitrarily picking the 5th of each month
day$clickElement()
submit <- remDr$findElement(using = 'xpath', "/html[1]/body[1]/form[1]/div[1]/a[1]")
submit$clickElement()
html <- read_html(remDr$getPageSource()[[1]])
description <- html %>% html_nodes(xpath = "//tr//tr[2]//td[1]") %>% html_text() %>% gsub("^\\s+|\\s+$", "", .)
meta <- html %>% html_nodes(xpath = "//td[@id='tdBg']") %>% html_text() %>% gsub("^\\s+|\\s+$", "", .)
date <- html %>% html_nodes(xpath = "//td[@id='bgHeaderDate']//div") %>% html_text() %>% gsub("^\\s+|\\s+$", "", .)
df <- data.frame(cbind(description,meta,date))
total <- rbind(total, df)
}
没有收到任何错误,但每次结果都出乎意料。它会在单个月/日组合上重复,例如 Jan05 * 12 次或 jan05 * 3 次、Apr 05 * 3 次等。
【问题讨论】:
-
是否必须与硒一起使用? (我知道这是一个供你学习的项目)
-
绝对不必是硒。如果有纯 R 或 tidyverse 解决方案,我会全力以赴。
标签: javascript r rvest rselenium