如何从R中的URL链接中提取每个主题的表-WebScraping

问题描述

我正在尝试为每个主题刮擦桌子:

这是主链接https://htmlaccess.louisville.edu/classSchedule/setupSearchClassSchedule.cfm?error=0,如下所示:

enter image description here

我必须选择每个主题并单击“搜索”,然后转到链接https://htmlaccess.louisville.edu/classSchedule/searchClassSchedule.cfm

每个主题给出一个不同的表。对于主题Accounting,我尝试获取如下表:我使用Selector Gadget Chrome扩展程序为node string

获取html_nodes
library(rvest)
library(tidyr)
library(dplyr)
library(ggplot2)

url <- "https://htmlaccess.louisville.edu/classSchedule/searchClassSchedule.cfm"
df <- read_html(url) 

tot <- df %>%
  html_nodes('table+ table td') %>%
  html_text()

但这没用:

## show
tot
character(0)

有没有一种方法可以用R代码获取每个主题的表?

解决方法

您的问题是该网站需要提交Web表单-单击页面上的“搜索”按钮即会发生这种情况。如果不提交该表格,您将无法访问数据。如果您尝试导航到要抓取的链接,这很明显-将其打入您最喜欢的Web浏览器中,您会发现“ https://htmlaccess.louisville.edu/classSchedule/ searchClassSchedule.cfm”。难怪什么都没出现!

幸运的是,您可以 使用R提交Web表单。但是,这需要更多代码。我最喜欢的软件包是SET,它与UPDATE很好地合作。这是将使用DELIMITER // CREATE TRIGGER if_no_iilName AFTER INSERT ON menbers FOR EACH ROW BEGIN IF (NEW.m_name IS NULL) THEN SET NEW.m_name = 'not given'; END IF; END// DELIMITER ; 提交表单,然后继续其余代码的代码。

httr

在我的机器上,它返回一个格式正确的矩阵,其中包含预期的数据。现在,挑战在于弄清楚在请求正文中添加什么内容。为此,我使用Chrome的“检查”工具(右键单击网页,然后单击“检查”)。在该侧面板的“网络”选项卡上,您可以跟踪浏览器正在发送的信息。如果我从主页开始,并且在“搜索”会计时保持该侧边选项卡的顶部,那么我会看到最高的匹配项是“ searchClassSchedule.cfm”,然后通过单击将其打开。在这里,您可以看到所有提交到服务器的表单字段,而我只是将它们手动复制到R中。

您的工作将是找出其余部门使用的缩写名称! “ ACCT”似乎是“会计”之一。将这些名称保存在向量中后,可以使用rvest循环或httr语句在它们上循环:

library(rvest)
library(dplyr)
library(httr)

request_body <- list(
  term="4212",subject="ACCT",catalognbr="",session="none",genEdCat="none",writingReq="none",comBaseCat="none",sustainCat="none",starttimedir="0",starttimehour="08",startTimeMinute="00",endTimeDir="0",endTimeHour="22",endTimeMinute="00",location="any",classstatus="0",Search="Search"
)

resp <- httr::POST(
  url = paste0("https://htmlaccess.louisville.edu/class","Schedule/searchClassSchedule.cfm"),encode = "form",body = request_body)
httr::status_code(resp)
df <- httr::content(resp)

tot <- df %>%
  html_nodes("table+ table td") %>%
  html_text() %>%
  matrix(ncol=17,byrow=TRUE)