【问题标题】:Web scraping with R: web site has two drop down menus使用 R 进行网页抓取:网站有两个下拉菜单
【发布时间】:2020-05-30 12:22:26
【问题描述】:

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

为了获得表格数据,我必须先选择年份,然后选择学术学校。我需要 2015-2019 年和大学内所有学校(ACC、ACM、...、WGS)的数据。当我选择年份和学校时,网址没有改变,这就是我没有得到表格数据的原因。我非常感谢您的帮助和建议。我可以创建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)

【问题讨论】:

    标签: r web-scraping


    【解决方案1】:

    您正在处理一个简单的表格,您需要为每个学期和每个科目更新和提交该表格。 Selenium 很好,但我认为这里可能有点矫枉过正。 rvest::html_session擅长这种事情:

    library(tidyverse)
    library(rvest)
    
    # Start session, extract semesters from form and filter.
    session <- html_session("https://www7.nau.edu/pair/reports/ClassDistribution")
    form <- html_form(session)[[1]]
    semesters <- form$fields[[5]]$options[-1]
    semesters <- semesters[grep("201[5-9]", names(semesters))]
    
    # Update form with semester info, submit, and extract subjects.
    form <- set_values(form, 'ctl00$MainContent$TermList' = semesters[1])
    session <- submit_form(session, form, "<unnamed>")
    form <- html_form(session)[[1]]
    subjects <- form$fields[[6]]$options
    
    # Update form with subject, submit, and extract data frame(s).
    form <- set_values(form, 'ctl00$MainContent$SubjectList' = subjects[1])
    session <- submit_form(session, form, "ctl00$MainContent$Button1")
    
    df_list <- html_table(session, T, T, T)
    

    需要注意的两件事:

    1. df_list 返回您需要组合的数据框列表。我推荐dplyr::bind_rows()
    2. 您需要两个循环:一个用于学期的外部循环,一个用于每个学期内的科目的内部循环。

    【讨论】:

    • 非常感谢!
    • 这两种解决方案都为我工作并节省了很多时间!
    • @DominikS.Meier 是的,由于某种原因,您看不到那么多。可能是因为“会话”的想法有点令人生畏/令人困惑,而且函数文档不是特别详尽。
    • @BehzodA,没问题!确保您单击复选标记以接受对您最有帮助的答案,以便其他人知道什么对您有用。
    【解决方案2】:

    这是使用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_valuesoption_values2 即可获取表格。

    【讨论】:

    • 感谢 Dominik 的帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-09-07
    • 2022-12-19
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多