问题描述
我正在尝试为每个主题刮擦桌子:
这是主链接https://htmlaccess.louisville.edu/classSchedule/setupSearchClassSchedule.cfm?error=0
,如下所示:
我必须选择每个主题并单击“搜索”,然后转到链接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)
解决方法
您的问题是该网站需要提交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)