使用R进行网页抓取:该网站有两个下拉菜单

时间:2020-05-30 12:22:26

标签: r web-scraping

我想使用R的for循环功能从以下网站获取成绩数据:https://www7.nau.edu/pair/reports/ClassDistribution

为了获取表格数据,我必须首先选择年份,然后再选择学院。我需要2015-2019年以及大学内所有学校(ACC,ACM,...,WGS)的数据。当我选择年份和学校时,URL不变,这就是为什么我没有表格数据的原因。非常感谢您的帮助和建议。我能够创建for循环,我只需要查看如何拉出第一个表即可。

我在静态网站上使用以下代码:

library(XML)
library(RCurl)
url <- "https://www7.nau.edu/pair/reports/ClassDistribution"
url.parsed <- htmlParse(getURL(url), asText = TRUE)
tableNodes <- getNodeSet(url.parsed, '//*[@id="pp_table"]/table')
grade_data <- readHTMLTable(tableNodes[[1]], header=F, stringsAsFactors=F)

2 个答案:

答案 0 :(得分:3)

这是使用[[{'user': 1, 'rating': 20}, {'user': 2, 'rating': 10}, {'user': 3, 'rating': 10}], [{'user': 4, 'rating': 4}, {'user': 2, 'rating': 80}, {'user': 1, 'rating': 30}]] 的解决方案。

RSelenium

现在,您只需要遍历library(RSelenium) rD <- rsDriver(browser = c("firefox")) #specify browser type you want Selenium to open remDr <- rD$client remDr$navigate("https://www7.nau.edu/pair/reports/ClassDistribution") # navigates to webpage # select first dropdown list option <- remDr$findElement(using='id', value="MainContent_TermList") #get all option values from dropdown list option_values <- option$getPageSource()[[1]] %>% str_extract_all("1[0-9]{3}") #select second dropdown list option2 <- remDr$findElement(using='id', value="MainContent_SubjectList") #get all option values from dropdown list option_values_2 <- option2$getElementText() %>% str_split("\\n") %>% unlist() #### create loop to loop over all tables... option <- remDr$findElement(using='id', value="MainContent_TermList") option <- remDr$findElement(using = 'xpath', "//*/option[@value = '1194']") #change '1194' to values in option_values in loop option$clickElement() # change dropdown selection option2 <- remDr$findElement(using='id', value="MainContent_SubjectList") option2 <- remDr$findElement(using = 'xpath', "//*/option[@value = 'AHB']") #change 'AHB' to values in option_values_2 in loop option2$clickElement() # click submit submit <- remDr$findElement(using='id', value="MainContent_Button1") submit$clickElement() #get table tb <- remDr$findElement(using='id', value="MainContent_GridView1") tb$getPageSource()[[1]] %>% read_html() %>% html_table(fill = TRUE) option_values即可获得表。

答案 1 :(得分:2)

您正在处理一个简单的表格,您需要为每个学期和科目进行更新和提交。硒很好,但我认为这里可能会过分杀伤。 ,擅长这类事情:

12345,Molly,2.5
 54321,Sally 3.5

需要注意的两件事:

  1. ArrayIndexOutOfBoundsException返回您需要合并的数据帧列表。我推荐rvest::html_session
  2. 您将需要两个循环:一个学期的外部循环,以及每个学期内主题的内部循环。