我的向量包含超过100个略有不同的网址,如何在不手动为每个网址写行的情况下进行抓取

时间:2019-07-17 12:04:38

标签: html r web-scraping

我正在尝试通过抓取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() ...  

2 个答案:

答案 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)怎么样?