[R-br] Selecionar e copiar conteúdo de página usando apenas o terminal linux
walmes .
walmeszeviani em gmail.com
Quarta Abril 30 21:12:36 BRT 2014
Senhores,
Como alguns apontaram os dados que preciso vem dando um curl no url. Com
código python sugerido pelo Alisson de alguma forma identifica a estrutura
com que é organizada os dados e já retorna em tabela. Será que não teria
uma forma de imitar o que python faz pelo R? Eu suspeito que seja uma
estrutura possível de passar um "parsador". Se fosse html ou xml daria para
usar um XML::htmlTreeParse(), mas pelo pouco que conheço é outra forma de
organização. Atualmente eu tô fazendo assim mas eu gostaria de melhorar o
código.
##-----------------------------------------------------------------------------
## Lê e joga em arquivo testo.
system("curl http://www.whoscored.com/Teams/1232 > page.txt")
## Pega só a linha com o conteúdo que interessa e joga em outro
## arquivo. Em seguida substitui as aspas por espaço vazio (quando não
## necessárias, aspas não são bem vindas).
system("grep \"DataStore.prime('stage-player-stat'\" page.txt > line.txt")
system("sed 's/'\\\"'//g' line.txt > Line.txt")
x <- readLines("Line.txt")
str(x)
## 1 quebra.
x <- unlist(strsplit(x, split="\\[\\{"))
str(x)
## 2 quebra.
y <- unlist(strsplit(x[2], split="\\},\\{"))
str(y)
## Substituição de `,` por `;`.
y <- gsub(",(\\S)", ";\\1", y)
str(y)
## Quebra os campos.
z <- strsplit(y, split=";")
str(z)
## Organização.
L <- lapply(z,
function(w){
w <- strsplit(w, ":")
i <- sapply(w, length)==2
w <- w[i]
x <- do.call(rbind, w)
y <- x[,2]
y <- gsub("\\W", "", y)
names(y) <- x[,1]
y
})
M <- do.call(rbind, L)
M <- as.data.frame(M, stringsAsFactors=FALSE)
M <- as.data.frame(lapply(M,
function(x){
y <- as.integer(x)
if(all(is.na(y))) return(x) else return(y)
}), stringsAsFactors=FALSE)
str(M)
##-----------------------------------------------------------------------------
Eu sei que tem partes não elegantes aí. O tratamento dos dados não é
perfeito. Requer muito ajuste fino e é por isso que acredito que deve ter
uma forma mais simples. A minha suspeita é se não tem como imitar o que é
feito pelo python na sugestão do Alisson.
Outro ponto é que essa base de dados tem 57 colunas. Tem muita informação.
Tem valores se o jogador deu ou levou foi drible. Se ele levou cartão
amarelo uma ou duas vezes e se levou vermelho. Veja um recorde do str().
$ Yellow : int 0 0 0 1 0 1 0 0 0 0 ...
$ SecondYellow : int 0 0 0 0 0 0 0 0 0 0 ...
$ Red : int 0 0 0 0 0 0 0 0 0 0 ...
$ AerialWon : int 3 2 5 0 3 0 3 3 1 0 ...
$ AerialLost : int 1 0 3 0 2 1 7 1 4 0 ...
$ WasDribbled : int 1 2 0 1 1 3 1 1 1 0 ...
$ Dribbles : int 0 2 0 0 4 2 0 1 0 0 ...
$ Height : int 172 176 189 172 178 167 185 171 179 191 ...
$ Weight : int 67 72 86 71 69 58 75 70 81 86 ...
Quantas disputas de bolas aéreas ganhas ou perdidas. Só nessa dá pra ver se
a chance de ganhar uma disputa aérea depende da altura do jogador, um
típico binomial. É muito produtivo trabalhar com dados assim em aula, por
isso o empenho em obtê-los.
Grato a todos pela ajuda, fico no aguardo por qualquer novidade.
Walmes.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20140430/91bf4912/attachment.html>
Mais detalhes sobre a lista de discussão R-br