我正在尝试通过抓取www.transfermarkt.de
中的数据来在德国杯中创建点球大战的数据集。
我设法抓取了一些数据并将它们放在一起,但是,接下来我需要为每个观察值在另一个网页上的变量。
接下来我需要的变量是俱乐部点球大战时所在的部门。
幸运的是,transfermarkt.de的排列很整齐,您只需稍微更改URL就可以获取所需的每个首页。
URL结构如下:https://www.transfermarkt.de/x/startseite/verein/105/saison_id/2001
x只是一个占位符,也可能有'z'或其他任何内容
105是俱乐部的ID
2001年是赛季的ID(因此俱乐部在哪个特定的赛季有点球大战)。
我有132个观测值,因此可能需要132个具有不同俱乐部和季节ID的URL。
我还将上传我的表格,以使您获得良好的概览。点击here。
我可以生成一个包含所有URL的向量,但是我不知道如何读取每个URL的HTML并立即获得划分信息。
library(rvest)
library(dplyr)
library(xml2)
library(stringr)
link = 'https://www.transfermarkt.de/x/startseite/verein'
rrr = paste(link, id_heim, "saison_id", Jahr, sep = "/") #id_heim is the club id of the home team, 'Jahr' is the year.
read_html(rrr) #error message because of more than 1 string
rrr是一个具有132个值的向量,与我的表相对应
看起来像这样
> head(rrr)
[1] "https://www.transfermarkt.de/x/startseite/verein/16/saison_id/2018"
[2] "https://www.transfermarkt.de/x/startseite/verein/30/saison_id/2018"
[3] "https://www.transfermarkt.de/x/startseite/verein/3/saison_id/2018"
[4] "https://www.transfermarkt.de/x/startseite/verein/25/saison_id/2018"
[5] "https://www.transfermarkt.de/x/startseite/verein/23826/saison_id/2017"
[6] "https://www.transfermarkt.de/x/startseite/verein/25/saison_id/2017"
read_html(rrr)给我这个:
doc_parse_file中的错误(con,编码=编码,as_html = as_html,选项=选项): 期望一个字符串值:[type = character;程度上= 132]。
感谢您的任何帮助或建议。
编辑:错误的回溯
Error in open.connection(x, "rb") : HTTP error 403.
14.
open.connection(x, "rb")
13.
open(x, "rb")
12.
read_xml.connection(con, encoding = encoding, ..., as_html = as_html,
base_url = x, options = options)
11.
read_xml.character(x, encoding = encoding, ..., as_html = TRUE,
options = options)
10.
read_xml(x, encoding = encoding, ..., as_html = TRUE, options = options)
9.
withCallingHandlers(expr, warning = function(w)
invokeRestart("muffleWarning"))
8.
suppressWarnings(read_xml(x, encoding = encoding, ..., as_html = TRUE,
options = options))
7.
read_html.default(x)
6.
read_html(x)
5.
eval(lhs, parent, parent)
4.
eval(lhs, parent, parent)
3.
read_html(x) %>% html_nodes(".box .table-header") %>% html_text() %>%
.[5] %>% substr(., 20, nchar(.) - 6) %>% as.character()
2.
FUN(X[[i]], ...)
1.
lapply(rrr, function(x) {
Sys.sleep(5)
read_html(x) %>% html_nodes(".box .table-header") %>% html_text() %>%
.[5] %>% substr(., 20, nchar(.) - 6) %>% as.character() ...
答案 0 :(得分:1)
嗨,您可以尝试像这样使用lapply
:
lapply(rrr, read_html)
这是在所有链接上运行一个(内部)循环,并逐个使用read_html
。然后,最终结果是一个列表,其中每个组件都是其中一个链接的结果。
如果要在函数调用之间创建中断,请尝试以下操作:
lapply(rrr, function(x) {Sys.sleep(2); read_html(x)}
答案 1 :(得分:0)
lapply(rrr, read_html)
怎么样?