我想从我订阅的网站中提取一些数据。我可以手动提取 csv 文件,但每天都有一个文件,而且我想要 5 年的数据,因此需要很长时间。
我已经使用 rvest 登录网站,但要下载数据,我需要手动单击按钮,如何在 R 中执行此操作?
当我手动执行此操作时,文件会进入我的下载文件夹,这完全没问题,因为我可以进行批量导入,但同样,如果我可以直接将数据加载到 R 中,那就会更容易一些。
这是我到目前为止所拥有的:
library(rvest)
url <-"http://www.horseracebase.com/index.php/"
pgsession <-html_session(url) ## create session
pgform <-html_form(pgsession)[[1]] ## pull form from session
filled_form <- set_values(pgform,
`login` = "xxx",
`password` = "yyy")
submit_form(pgsession,filled_form)
这让我登录(我认为),但现在我不知道如何提取数据?
我在 Betfair 上做了同样的事情,我使用类似的东西:
df <- read.csv("http://www.someurl.com/betfairdata.csv")
这工作正常,但所有文件都列在实际页面上,因此不需要单击按钮。
有没有办法使用 rvest 与按钮进行交互,或者有没有办法找到正确的 URL,这样我就可以像上面那样使用 read.csv
?
谢谢
最佳答案
我创建了一个免费帐户并检查了该网站。
看起来您正在将 .csv 文件与 HTML 表格合并。我在网站上找不到任何 .csv 文件。当您说“没有点击”并且它们“显示 .csv 文件”时,您实际上描述的是一个 HTML 表格。
顺便说一句,网站后端也没有 .csv 文件。后端是一个关系数据库,为许多过滤器和搜索功能提供支持。
话虽如此,在文档、SO 答案以及 Google 上的各种博客中,有大量关于如何使用 rvest 和其他 R 包抓取 XML 和 HTML 表的资源(如果没有在 Stack Overflow 文档上——我没有检查过,但它可能也在那里)。我将引用Stats and Things中的一个,但请注意,html()
已被弃用,取而代之的是 read_html()
,尽管两者仍然有效:
library("rvest")
url <- "http://en.wikipedia.org/wiki/List_of_U.S._states_and_territories_by_population"
population <- url %>%
html() %>%
html_nodes(xpath='//*[@id="mw-content-text"]/table[1]') %>%
html_table()
population <- population[[1]]
head(population)
您可以使用 Chrome 或 FireFox 中的内置开发人员工具来识别需要提取的页面部分。您还可以使用 Firebug 等第 3 方工具,但这并不是真正必要的。
例如:
- 在浏览器中登录并点击“研究”
- 点击统计
- Click Jockey 7 天表现
- 打开开发者工具
- 点击“选择一个元素进行检查”按钮
- 将鼠标悬停或单击 HTML 表格
- 突出显示的源代码对应于此表 - 右键单击突出显示的源代码
- 点击“复制 X 路径”
- 您的剪贴板现在有了目标 - 在本示例中为
/html/body/table[2]/tbody/tr/td/table[2]
当然,如果您想将解析结果保存到 .csv(或任何其他类型)文件中,您可以在将其放入 data.frame
后执行此操作, data.table
,或其他平面对象:
write.csv(population, "population.csv", row.names=F)
请注意,有些人发现使用 XML
包中的 readHTMLTable()
来抓取表格更容易,尽管两者都可以完成这项工作。
关于r - 从网站提取 .csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41414911/