Introdução à raspagem na Web de dados de futebol com o R!

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


[Esteartigofoipublicadopelaprimeiravezem[Thisarticlewasfirstpublishedon R por R (yo), e gentilmente contribuiu para R-blogueiros]. (Você pode relatar um problema sobre o conteúdo desta página aqui)


Deseja compartilhar seu conteúdo com R-blogueiros? clique aqui se você tiver um blog ou aqui se não tiver.

Os fãs de futebol foram deixados privados de sua forma principal de
entretenimento nos últimos meses e eu vi um grande aumento no
quantidade de fãs e blogueiros casuais que se voltam para aprender programação
linguagens como R ou Python para aumentar seus kits de ferramentas analíticas. Livre
dados facilmente acessíveis podem ser difíceis de encontrar se você apenas começou
por esse caminho e, mesmo quando o fizer, você descobrirá que eventualmente
arrastar o mouse e copiar coisas para o Excel simplesmente não está na hora
eficiente ou possível. A solução para isso é a raspagem da web! No entanto, eu
sinto que muitas pessoas não estão cientes dos enigmas éticos
raspagem da Web ao redor (especialmente se você vem de fora de um
ciência de dados / programação / etc. fundo … e mesmo se você for, eu poderia
adicionar). Eu sou por não significa um especialista mas desde que comecei a aprender sobre
tudo o que eu tentei “Raspar a web com responsabilidade” e esse princípio será
enfatizado ao longo desta postagem do blog. Eu vou passar por exemplos para
raspar dados de futebol de
Wikipedia,
soccerway.com e
transfermarkt.com. Observe que isso é
focado na parte de raspagem da web e não abordará a visualização,
links para o código viz serão fornecidos no final de cada seção e você
sempre pode verificar o meu
Repo do Github para soccer_ggplot
para mais futebol viz bondade!

De qualquer forma, vamos começar!

Raspagem da Web com Responsabilidade

Quando pensamos em R e raspagem na web, normalmente pensamos direito
para carregar {rvest} e indo direto no nosso caminho alegre. No entanto, existem
há muitas coisas que você deve saber sobre práticas de raspagem na web
antes de começar a mergulhar. “Só porque você pode, não significa que você
devemos.” robots.txt é um arquivo em sites que descrevem o
permissões / privilégios de acesso para quaisquer bots e rastreadores encontrados
o site. Certas partes do site podem não estar acessíveis para determinadas
bots (digamos, Twitter ou Google), alguns podem não estar disponíveis e, em
No caso mais extremo, a raspagem da Web pode até ser proibida. No entanto, faça
note que só porque não há robots.txt arquivo ou que é
permissivo de raspagem na web não significa automaticamente que você é
permitido raspar. Você deve sempre verificar o site “Termos de
Usar”
ou páginas semelhantes.

A raspagem na Web ocupa largura de banda para um host, especialmente se ele abriga muitos
De dados. Então, escrevendo bots de raspagem na web e funções educadas e
respeitoso com o site de hospedagem é necessário para que não
sites inconvenientes que são nos fazendo um serviço fazendo o
dados disponíveis para nós para livre! Há muitas coisas que levamos para
concedido, especialmente em relação a dados de futebol gratuitos, vamos garantir que
pode mantê-lo assim.

Em R, existem vários pacotes diferentes que facilitam
pacotes de raspagem da web responsáveis, incluindo:

  • {robotstxt} é um pacote
    criado por Peter Meissner e
    fornece funções para analisar robots.txt arquivos de maneira limpa.

  • {ratelimitr} criado por
    Tarak Shah fornece maneiras de limitar o
    taxa que funções são chamadas. Você pode definir um certo n chamadas
    por period de tempo para qualquer função envolvida em
    ratelimitr::limit_rate().

O pacote {polite} exige muito
as coisas mencionadas anteriormente em um pacote puro que flui
perfeitamente com a API {rvest}. Eu tenho usado este pacote quase
desde o seu primeiro lançamento e é fantástico! Eu tenho que ver o pacote
autor (Dmytro Perepolkin) faz um
apresentação no UseR
2019 você pode
encontre a gravação de vídeo
aqui.
Esta postagem do blog se concentrará principalmente no uso de {rvest} em combinação com
o pacote {polite}.

Página da web única (Wikipedia)

library(rvest)
library(polite)
library(dplyr)
library(tidyr)
library(purrr)
library(stringr)
library(glue)
library(rlang)

Para o primeiro exemplo, vamos começar com a captura de dados de futebol de
Wikipedia, especificamente os artilheiros da Copa da Ásia.

Nós usamos polite::bow() passar o URL para o artigo da Wikipedia obter
um objeto de sessão educado. Este objeto informará sobre o
robots.txt, o atraso de rastreamento recomendado entre as tentativas de raspagem e
informa se você tem permissão para raspar este URL ou não. Você pode
adicione também seu próprio nome de usuário no diretório user_agent argumento para introduzir
você mesmo no site.

topg_url <- "https://en.wikipedia.org/wiki/AFC_Asian_Cup_records_and_statistics"

session <- bow(topg_url,
               user_agent = "Ryo's R Webscraping Tutorial")

session
##  https://en.wikipedia.org/wiki/AFC_Asian_Cup_records_and_statistics
##     User-agent: Ryo's R Webscraping Tutorial
##     robots.txt: 454 rules are defined for 33 bots
##    Crawl delay: 5 sec
##   The path is scrapable for this user-agent

Claro, só para ter certeza, lembre-se de ler a página “Termos de uso”
também. No entanto, quando se trata da Wikipedia, você pode simplesmente baixar todos
da Wikipedia
dados
você mesmo e faça uma pesquisa de texto nesses arquivos, mas isso é
fora do escopo deste post do blog, talvez outra hora!

Agora, para realmente obter os dados da página da web. Você tem diferente
opções, dependendo do navegador que você está usando, mas no Google Chrome ou
Mozilla Firefox, você pode encontrar o elemento HTML exato clicando com o botão direito do mouse em
e clique em “Inspecionar” ou “Inspecionar Elemento” no pop-up
cardápio. Ao fazer isso, uma nova exibição será exibida, mostrando o código HTML completo
conteúdo da página da web com o elemento que você escolheu realçado. (Veja as duas primeiras fotos)

Você também pode tentar usar uma ferramenta JavaScript útil chamada SelectorGadget,
você pode aprender como usá-lo
aqui. isto
permite clicar em diferentes elementos da página da web e
o gadget tentará verificar o seletor de CSS exato no HTML. (Veja foto abaixo)

Esteja avisado de que as páginas da Web podem mudar repentinamente eo seletor CSS
usado no passado pode não funcionar mais. Isso aconteceu mais do que algumas vezes
à medida que as páginas são atualizadas com mais informações de novos torneios e similares. este
é por isso que você realmente deve tentar copiar de um site mais estável, mas um
muitas vezes para dados “simples” A Wikipedia é o melhor e mais fácil lugar
raspar.

Leia Também  Esqueça o plano B, a falha não é uma opção

A partir daqui, você pode clicar novamente com o botão direito do mouse no código HTML realçado para
“Copiar” e, em seguida, você pode escolher um dos “Seletor de CSS”, “Caminho do CSS” ou
“XPath”. Eu normalmente uso “CSS Selector” e será o que eu usarei
ao longo deste tutorial. Esta é a referência exata dentro do HTML
código da página do objeto que você deseja. Certifique-se de escolher o
Seletor de CSS para o mesa em si e não apenas as informações dentro do
mesa.

Com isso copiado, você pode ir para o seu script R / RMD / etc. Depois de executar o
polite::scrape() função no seu bow objeto, cole no CSS
Seletor / Caminho / XPath que você acabou de copiar html_nodes(). o bow

O objeto já possui o atraso de raspagem recomendado, conforme estipulado em um
site robots.txt então você não precisa inseri-lo manualmente quando
raspar.

ac_top_scorers_node <- scrape(session) %>%
  html_nodes("table.wikitable:nth-child(44)")

Pegar uma tabela HTML é a maneira mais fácil de obter dados como você normalmente
não precisa fazer muito trabalho para remodelar os dados posteriormente. Nós podemos fazer
isso com o html_table() função. Como o objeto HTML retorna como um
lista, precisamos nivelá-lo um nível usando purrr::flatten_df() .
Conclua a limpeza removendo a coluna desnecessária “Ref” com
select() e renomeando os nomes das colunas com set_names().

ac_top_scorers <- ac_top_scorers_node %>% 
  html_table() %>% 
  flatten_df() %>% 
  select(-Ref.) %>% 
  set_names(c("total_goals", "player", "country"))

Depois de adicionar algumas imagens de bandeira e bola de futebol ao data.frame, obtemos
isto:

Observe que a própria imagem é de antes a Copa da Ásia de 2019, mas
os dados que coletamos no código acima são Atualizada. Como uma visualização
desafio tente criar um viz semelhante com os dados atualizados! Você pode
dê uma olhada no meu blog Asian Cup 2019
postar como
Eu fiz isso. Como alternativa, você pode tentar fazer o mesmo que acima, exceto com
a
Euros.
Tente pegar a tabela de artilheiros dessa página e faça seu próprio
gráfico!

Página única (Transfermarkt)

Agora, vamos tentar um site específico para futebol, pois esse é realmente o objetivo de
este post do blog. Desta vez, vamos para um dos futebol mais famosos
sites ao redor, transfermarkt.com. Um site usado como fonte de dados
do seu humilde blogueiro de futebol a grandes sites de notícias como o Financial
Tempos e
a BBC.

O exemplo que tentaremos é de um gráfico de idade-valor da J-League que eu criei
cerca de 2 anos atrás, quando eu comecei a fazer dados de futebol (como
moscas…).

url <- "https://www.transfermarkt.com/j-league-division-1/startseite/wettbewerb/JAP1/saison_id/2017"

session <- bow(url)

session
##  https://www.transfermarkt.com/j-league-division-1/startseite/wettbewerb/JAP1/saison_id/2017
##     User-agent: polite R package - https://github.com/dmi3kno/polite
##     robots.txt: 1 rules are defined for 1 bots
##    Crawl delay: 5 sec
##   The path is scrapable for this user-agent
  • Termos de Uso (em alemão)

As etapas básicas são as mesmas de antes, mas descobri que pode ser
bastante complicado encontrar os nós certos no transfermarkt mesmo com o
Gadget Seletor de CSS ou outros métodos que descrevemos nas seções anteriores.
Depois de um tempo, você se acostumará às peculiaridades de como o site é
estruturado e saber quais são os ativos (tabelas, colunas, imagens)
chamado facilmente. Este é um site onde o SelectorGadget realmente vem
a calhar!

Desta vez, não vou pegar uma mesa inteira como fiz com
Wikipedia, mas vários elementos da página da web. Você definitivamente
lata raspar a mesa como mostrei acima com html_table() mas
neste caso, não porque a saída da tabela estava bastante bagunçada, me deu
muito mais informações do que eu realmente precisava, e eu não era muito bom em
regex / stringr para limpar o texto há 2 anos. Tente fazê-lo da maneira abaixo
e também agarrando a mesa inteira para mais prática.

O jeito que eu fiz na época também funciona para esta postagem no blog porque eu
pode mostrar algumas outras html_*() {rvest} funções:

  • html_table(): Obter dados de uma tabela HTML
  • html_text(): Extrair texto do HTML
  • html_attr(): Extrair atributos do HTML ("src" para imagem
    nome do arquivo, "href" para o endereço do link da URL)
team_name <- scrape(session) %>% 
  html_nodes("#yw1 > table > tbody > tr > td.zentriert.no-border-rechts > a > img") %>% 
  html_attr("alt")

# average age
avg_age <- scrape(session) %>% 
  html_nodes("tbody .hide-for-pad:nth-child(5)") %>% 
  html_text()

# average value
avg_value <- scrape(session) %>% 
  html_nodes("tbody .rechts+ .hide-for-pad") %>% 
  html_text()

# team image
team_img <- scrape(session) %>% 
  html_nodes("#yw1 > table > tbody > tr > td.zentriert.no-border-rechts > a > img") %>% 
  html_attr("src")

Com cada elemento coletado, podemos colocá-los em uma lista e remodelá-los
em um bom quadro de dados.

# combine above into one list
resultados <- list(team_name, avg_age, avg_value, team_img)

# specify column names
col_name <- c("team", "avg_age", "avg_value", "img")

# Combine into one dataframe
j_league_age_value_raw <- resultados %>% 
  reduce(cbind) %>% 
  tibble::as_tibble() %>% 
  set_names(col_name)

glimpse(j_league_age_value_raw)
## Rows: 18
## Columns: 4
## $ team       "Vissel Kobe", "Urawa Red Diamonds", "Kawasaki Frontale",...
## $ avg_age    "25.9", "26.3", "25.5", "24.1", "25.4", "25.0", "25.0", "...
## $ avg_value  "€1.02m", "€698Th.", "€577Th.", "€477Th.", "€524Th.", "€5...
## $ img        "https://tmssl.akamaized.net/images/wappen/tiny/3958.png?...

Com um pouco mais de limpeza e {ggplot2} mágica (consulte
aqui,
a partir da linha 53), você receberá:

Alguns outros exemplos raspando páginas da web únicas:

  • transfermarkt: gráfico simples de utilidade etária de
    2018
  • Seção “Vencedores da Copa América” ​​de Visualização da Copa
    América com
    R

Várias páginas da Web (Soccerway, Transfermarkt, etc.)

Os exemplos anteriores analisaram a raspagem de uma única página da Web, mas
geralmente você deseja coletar dados para cada equipe de uma liga, cada jogador
de cada equipe, ou cada jogador de cada equipe em cada liga, etc.
é aí que entra a complexidade adicional de várias páginas de raspagem na web.
A maneira mais eficiente é ser capaz de raspar programaticamente
várias páginas de uma só vez, em vez de executar a mesma função de raspagem
no link do URL de diferentes equipes / jogadores várias vezes.

Pensando em como raspar

  • Entenda a estrutura do site: como ele organiza suas páginas, verifique
    como são os seletores CSS / XPaths etc.
  • Obtenha uma lista de links: Links da página da equipe na página da liga, na página do jogador
    links da página da equipe etc.
  • Crie suas próprias funções R: identifique exatamente o que você deseja
    raspagem, bem como algumas etapas de limpeza pós-raspagem em uma função
    ou múltiplas funções.
  • Comece pequeno e depois amplie: teste sua função de raspagem em um
    jogador / equipe, faça todo o time / liga.
  • Itere sobre um conjunto de links de URL: use {purrr}, for rotações,
    lapply() (seja qual for sua preferência).
Leia Também  O que estudar se você estiver em quarentena

Veja o link da URL de cada página da web que você deseja reunir. O que são as
semelhanças? Quais são as diferenças? Se é um site adequado que
a página da web para uma determinada visualização de dados para cada equipe deve ser exatamente a
mesmo, como você espera que contenha exatamente o mesmo tipo de informação apenas
para uma equipe diferente. Neste exemplo, cada página de “exibição de esquadrão” para cada
Equipe da Premier League em soccerway.com estão estruturados da mesma forma:
“Https://us.soccerway.com/teams/england/”
e depois o “nome da equipe /”, o “número da equipe /” e, finalmente, o nome de
a página da web, “esquadrão /”. Então, o que precisamos fazer aqui é descobrir o
“Nome da equipe” e “número da equipe” para cada uma das equipes e armazene-as. Nós
pode alimentar cada par desses valores um de cada vez para raspar o
informações para cada equipe.

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br
url <- "https://us.soccerway.com/national/england/premier-league/20182019/regular-season/r48730/"

session <- bow(url)

session
##  https://us.soccerway.com/national/england/premier-league/20182019/regular-season/r48730/
##     User-agent: polite R package - https://github.com/dmi3kno/polite
##     robots.txt: 4 rules are defined for 3 bots
##    Crawl delay: 5 sec
##   The path is scrapable for this user-agent
  • Termos de uso

Para encontrar esses elementos, basta clicar no link de cada equipe e
anote-os … mas espere, nós também podemos raspar isso! Nós usamos o
html_attr() para pegar a parte “href” do HTML, que
contém o hiperlink desse elemento. A imagem da esquerda está olhando
o link do URL de um dos botões para a página de uma equipe por meio de “Inspecionar”. o
a imagem certa é selecionar o link de cada equipe por meio do SelectorGadget.

team_links <- scrape(session) %>% 
  html_nodes("#page_competition_1_block_competition_tables_8_block_competition_league_table_1_table .large-link a") %>% 
  html_attr("href")

team_links[[1]]
## [1] "/teams/england/manchester-city-football-club/676/"

O URL fornecido no href do HTML para os botões da equipe
infelizmente não são os cheio URL necessário para acessar essas páginas. assim
temos que cortar os bits importantes e recriá-los nós mesmos. Nós
pode usar o pacote {glue} para combinar o “team_name” e o “team_num”
para cada equipe no URL incompleto em um URL completo em uma nova coluna
nós ligaremos link.

team_links_df <- team_links %>% 
  tibble::enframe(name = NULL) %>% 
  ## separate out each component of the URL by / and give them a name
  tidyr::separate(value, c(NA, NA, NA, "team_name", "team_num"), sep = "/") %>% 
  ## glue together the "team_name" and "team_num" into a complete URL
  mutate(link = glue("https://us.soccerway.com/teams/england/{team_name}/{team_num}/squad/"))

glimpse(team_links_df)
## Rows: 20
## Columns: 3
## $ team_name  "manchester-city-football-club", "liverpool-fc", "chelsea...
## $ team_num   "676", "663", "661", "675", "660", "662", "680", "674", "...
## $ link       "https://us.soccerway.com/teams/england/manchester-city-...

Fantástico! Agora, temos os links de URL adequados para cada equipe. Em seguida, temos
para realmente olhar para uma das próprias páginas da web para descobrir o que
exatamente precisamos raspar da página da web. Isso pressupõe que cada web
página e o CSS Selector para os vários elementos que queremos pegar são
o mesmo para todas as equipes. Como isso é uma contribuição de objetivo muito simples
traçar tudo o que precisamos reunir da página de cada equipe é o “nome do jogador”,
“Número de gols” e “número de assistências”. Use o Inspect element ou
a SelectorGadget ferramenta para pegar o código HTML dessas estatísticas.

Abaixo, eu dividi cada uma delas em sua própria função de miniaplicador. Quando você é
trabalhando nesta parte, você deve tentar usar o link da URL de uma equipe
e construa suas funções de raspador a partir desse link (eu costumo usar o Liverpool
como meu exemplo de teste ao juntar equipes da Premier League). Observe que todos
três das mini-funções abaixo poderiam ser simplesmente colocadas em uma grande
função, mas eu gosto de manter as coisas compartimentadas.

player_name_info <- function(session) {
  
  player_name_info <- scrape(session) %>% 
    html_nodes("#page_team_1_block_team_squad_3-table .name.large-link") %>% 
    html_text()
}

num_goals_info <- function(session) {

  num_goals_info <- scrape(session) %>% 
    html_nodes(".goals") %>% 
    html_text()
  
  ## first value is blank so remove it
  num_goals_info_clean <- num_goals_info[-1]
}

num_assists_info <- function(session) {

  num_assists_info <- scrape(session) %>% 
    html_nodes(".assists") %>% 
    html_text()
  
  ## first value is blank so remove it
  num_assists_info_clean <- num_assists_info[-1]
}

Agora que temos raspadores para cada estatística, podemos combiná-los em um
função maior que reunirá todos eles em um bom quadro de dados
para cada equipe que queremos juntar. Se você inserir algum membro da equipe
URLs de team_links_df, ele coletará o “nome do jogador”, “número de
objetivos “e” número de assistências “para essa equipe.

premier_stats_info <- function(link, team_name) {
  
  team_name <- rlang::enquo(team_name)
  ## `bow()` for every URL link
  session <- bow(link)
  
  ## scrape different stats
  player_name <- player_name_info(session = session)

  num_goals <- num_goals_info(session = session)

  num_assists <- num_assists_info(session = session)
  
  ## combine stats into a data frame
  resultados <- list(player_name, num_goals, num_assists)
  col_names <- c("name", "goals", "assists") 
  
  premier_stats <- resultados %>% 
    reduce(cbind) %>% 
    as_tibble() %>% 
    set_names(col_names) %>% 
    mutate(team = !!team_name)
  
  ## A little message to keep track of how the function is progressing:
  # cat(team_name, " done!")
  
  return(premier_stats)
}

OK, agora temos uma função que pode raspar os dados para 1 equipe
mas seria extremamente ponderoso voltar a executá-lo outras dezenove vezes
para todas as outras equipes … então o que podemos fazer? É aqui que o
purrr::map() família de funções e iteração entra! o map()

A família de funções permite aplicar uma função (uma existente de
um pacote ou um que você mesmo criou) para cada elemento de uma lista
ou vetor que você passa como argumento para a função de mapeamento. Para nossos propósitos, este
significa que podemos usar as funções de mapeamento para transmitir uma lista de URLs (por
qualquer número de jogadores e / ou equipes) junto com uma função de raspagem
de modo que o raspe completamente de uma só vez.

Além disso, podemos usar purrr::safely() para envolver qualquer função
(incluindo os personalizados). Isso faz com que essas funções retornem uma lista
com os componentes result e error. Isso é extremamente útil para
a depuração de funções complicadas, pois a função não gera apenas erros e
não lhe dá nada, mas pelo menos o resultado das partes da função
que trabalhou em result com o que não funcionou error.

Por exemplo, digamos que você esteja raspando dados da página da web de cada equipe
na Premier League (repetindo uma única função de raspagem em cada
página da web das equipes) e por algumas peculiaridades estranhas no HTML da página da web ou
no seu código, os dados de uma equipe são errados (enquanto os outros 19
os dados das equipes são coletados sem problemas). Normalmente, isso significa que o
dados que você coletou todos outras páginas da web que fez trabalhos
não vai ser devolvido, o que pode ser extremamente frustrante. Com um
safely() função agrupada, os dados das 19 equipes que os
A função conseguiu raspar é retornada em result componente do
objeto de lista enquanto a equipe com erro e a mensagem de erro são retornadas em
a error componente. Isso facilita muito a depuração quando você sabe
exatamente qual iteração da função falhou.

safe_premier_stats_info <- safely(premier_stats_info)

Já temos uma boa lista de links de URL da equipe no quadro de dados
team_links_df, especificamente na coluna “link”
(team_links_df$link) Então passamos isso adiante como argumento para map2()

(que é apenas uma versão do map() mas para duas entradas de argumento) e nossa
premier_stats_info() para que a função seja aplicada a
cada link do URL da equipe. Esta parte pode demorar um pouco, dependendo do seu
conexão com a Internet e / ou se você atribuir um valor alto ao atraso do rastreamento.

goal_contribution_df_ALL <- map2(.x = team_links_df$link, .y = team_links_df$team_name,
                             ~ safe_premier_stats_info(link = .x, team_name = .y))

## check out the first 4 results:
glimpse(head(goal_contribution_df_ALL, 4))

Como você pode ver (os resultados / erros das quatro primeiras equipes foram raspados),
para cada equipe, há uma lista contendo um elemento “resultado” e “erro”.
Nos quatro primeiros, pelo menos, parece que tudo foi raspado
corretamente em um bom data.frame. Podemos verificar se alguma das vinte equipes
teve um erro de purrr::discard()-ing quaisquer elementos da lista que
saia como NULL e veja se resta alguma coisa.

## check to see if any failed:
goal_contribution_df_ALL %>% 
  map("error") %>% 
  purrr::discard(~is.null(.))
## list()

Ele sai como uma lista vazia, o que significa que não houve erros no “erro”
elementos. Agora podemos espremer e combinar dados individuais da equipe. Quadros em
um data.frame usando dplyr::bind_rows().

goal_contribution_df <- goal_contribution_df_ALL %>% 
  map("result") %>% 
  bind_rows()

glimpse(goal_contribution_df)
## Rows: 622
## Columns: 4
## $ name     "C. Bravo", "Ederson Moraes", "S. Carson", "K. Walker", "J....
## $ goals    "0", "0", "0", "1", "0", "0", "0", "0", "0", "2", "0", "0",...
## $ assists  "0", "0", "0", "2", "0", "0", "0", "2", "0", "0", "0", "0",...
## $ team     "manchester-city-football-club", "manchester-city-football-...

Com isso, podemos limpar um pouco os dados e finalmente começar a plotagem! Você pode encontrar o código no original
essência
para ver como eu criei o enredo abaixo. Eu realmente gostaria de entrar
detalhes, especialmente porque eu uso um dos meus pacotes de plotagem favoritos,
{ggforce}, aqui, mas merece seu próprio post no blog.

Leia Também  Criando R 4+ para Windows com OpenBLAS

Como você pode ver, este foi para a temporada 2018-2019. Eu fiz um similar
um mas usando xG per 90 e xA per 90 para a temporada 2019-2020 (como
1 de janeiro de 2020, no mínimo) usando dados do FBRef
aqui. Você pode encontrar o
código para isso
aqui.
No entanto, eu fiz não raspá-lo a partir de seus Termos de
Use a página, FBRef (ou
qualquer site da SportsRef) não permitir raspagem da web
(“Spidering”, “robots”). Felizmente, eles fazem isso muito fácil para
acessar seus dados como disponíveis para download .csv arquivos, basta clicar em alguns
botões, para obter seus dados não é realmente um problema!

Para praticar, tente fazê-lo em uma estação diferente ou em uma estação diferente.
liga completamente!

Para outros exemplos de raspagem de várias páginas:

  • transfermarkt: (plot Age-Utility inspirado no Opta de 28 de fevereiro de
    2020)

Conclusão

Esta postagem do blog abordou a raspagem da Web, com foco na obtenção de dados de futebol
de sites de futebol de maneira responsável. Após uma breve visão geral do
práticas de raspagem responsáveis ​​com R eu examinei vários exemplos de
obtendo dados de futebol de vários sites. Não afirmo que seja o
maneira mais eficiente, mas importante, ele realiza o trabalho e de uma maneira
maneira educada. Mais raspagem em escala industrial em centenas e milhares
de páginas da web está um pouco fora do escopo de uma postagem de blog introdutória e
não é algo que eu realmente tenha feito, então vou passar adiante
lanterna para alguém que queira escrever sobre isso. Ha outro
maneiras de raspar sites usando R, especialmente sites com dinâmica
páginas da web, usando R Selenium,
Chrome sem cabeça (crrri) e outros
Ferramentas.

No que diz respeito ao FBRef, como agora é realmente um popular
site a ser usado (especialmente em parceria com a StatsBomb), existem
é um post do blog detalhando uma maneira de usar o R ​​Selenium para se locomover
os termos estipulados e o raciocínio parece bom, mas ainda não estou 100%
certo. Isso vai de novo para o modo como muitos scraping da Web podem ser
às vezes, como para todos os avisos claros em alguns sites que você
tem muito mais ambiguidade e capacidade de usar algum
interpretação em outros. No final do dia, você só precisa fazer
seu diligência devidapergunte permissão diretamente, se possível, e seja
{educado} sobre isso.

Alguns outros tutoriais de scraping da web em que você pode estar interessado:

  • Coletando a Web com o rvest (pacote rvest
    vinheta)
  • Web raspando o {educado}
    caminho

Como sempre, você pode encontrar mais coisas relacionadas ao futebol neste site
ou no soccer_ggplots Github
repo!

Feliz (responsável) raspagem na Web!

var vglnk = {key: ‘949efb41171ac6ec1bf7f206d57e90b8’};

(função (d, t) {
var s = d.createElement
s.src = ‘//cdn.viglink.com/api/vglnk.js’;
var r = d.getElementsByTagName
} (documento, ‘script’));

Para Deixe um comentário para o autor, siga o link e comente no blog: R por R (yo).

R-bloggers.com oferece atualizações diárias por email sobre notícias e tutoriais do R sobre o aprendizado do R e muitos outros tópicos. Clique aqui se você deseja publicar ou encontrar um emprego em ciência da dados / R.


Deseja compartilhar seu conteúdo com R-blogueiros? clique aqui se você tiver um blog ou aqui se não tiver.



cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br