27 votes

Comment gratter le web pour la liste des dates de sortie de R?

Pour célébrer les 20 000 ème question avec le -tag sur un Débordement de Pile, veuillez m'aider à extraire les R les dates de sortie à partir de la page de Wikipedia.

Mes tentatives:

library(XML)
x <- readHTMLTable("http://en.wikipedia.org/wiki/R_(programming_language)")

Cela ne fonctionne pas, car la table est en fait une liste, pas un tableau HTML.

library(httr)
x <- GET("http://en.wikipedia.org/wiki/R_(programming_language)")
text <- content(x, "parsed")

Cet extrait le texte, mais mon xpath est rouillé, donc je ne pouvais pas tirer les dates de sortie.

Comment puis-je faire cela?


PS. La page Wikipedia est la seule source que j'ai pu trouver, mais s'il vous plaît n'hésitez pas à poster une solution à l'aide canonique source, si il y en a un.

23voto

Dirk Eddelbuettel Points 134700

Pourquoi n'utilisez-vous pas les dates de fichier sur l'archive ftp canonique à Vienne?

Modifier: par exemple

  lynx -dump http://cran.r-project.org/src/base/R-0/ | grep tgz | grep -v http
 

vous obtient une table que vous pouvez analyser à partir de R. Vous permet de bénéficier de la taille des fichiers. Rincer et répéter pour les répertoires R-1 et R-2.

19voto

Andrie Points 66979

Modifié pour inclure R version 3.0.0 et supérieure

Dirk Eddelbuettel a fourni le lien canonique vers les versions .0 de R.

Voici un code qui rassemble les tables des trois URL distinctes, une pour chaque version principale, puis tracez-la:

 library(XML)
library(lattice)


getRdates <- function(){
  url <- paste0("http://cran.r-project.org/src/base/R-", 0:3)
  x <- lapply(url, function(x)readHTMLTable(x, stringsAsFactors=FALSE)[[1]])
  x <- do.call(rbind, x)
  x <- x[grep("R-(.*)(\\.tar\\.gz|\\.tgz)", x$Name), c(-1, -5)]
  x$Release <- gsub("(R-.*)\\.(tar\\.gz|tgz)", "\\1", x$Name)
  x$Date <- as.POSIXct(x[["Last modified"]], format="%d-%b-%Y %H:%M")
  x$Release <- reorder(x$Release, x$Date)
  x
}

x <- getRdates()
dotplot(Release~Date, data=x)
 

entrez la description de l'image ici

16voto

Brandon Bertelsen Points 13424

Une sorte de tricherie, maintenant que Dirk nous a donné une table facile à gratter:

 library(XML)
theurl <- "http://cran.r-project.org/src/base/R-0/"
h <- htmlParse(theurl)
h <- readHTMLTable(h)
h <- h[[1]]
h <- droplevels(h[-c(1,2,30),])
levels(h$Name) <- gsub(".tgz","",levels(h$Name),fixed=TRUE)

h
 

Nous donne:

          Name     Last modified Size Description
3      R-0.49 23-Apr-1997 14:53 959K            
4   R-0.50-a1 22-Jul-1997 16:44 1.0M            
5   R-0.50-a4 10-Sep-1997 14:31 1.0M            
6    R-0.60.0 04-Dec-1997 09:58 1.1M            
7    R-0.60.1 07-Dec-1997 02:59 1.1M            
8    R-0.61.0 22-Dec-1997 00:00 1.1M            
9    R-0.61.1 13-Jan-1998 00:00 1.1M            
10   R-0.61.2 18-Mar-1998 00:00 1.1M            
11   R-0.61.3 03-May-1998 00:00 1.1M            
12   R-0.62.0 15-Jun-1998 00:00 1.2M            
13   R-0.62.1 15-Jun-1998 00:00 1.2M            
14   R-0.62.2 10-Jul-1998 11:59 1.3M            
15   R-0.62.3 28-Aug-1998 11:01 1.3M            
16   R-0.62.4 24-Oct-1998 00:00 1.3M            
17   R-0.63.0 14-Nov-1998 04:57 1.5M            
18   R-0.63.1 05-Dec-1998 02:25 1.5M            
19   R-0.63.2 12-Jan-1999 02:21 1.5M            
20   R-0.63.3 06-Mar-1999 04:27 1.5M            
21   R-0.64.0 08-Apr-1999 01:48 1.5M            
22   R-0.64.1 08-May-1999 02:55 1.9M            
23   R-0.64.2 05-Jul-1999 21:15 1.9M            
24   R-0.65.0 28-Aug-1999 00:18 2.1M            
25   R-0.65.1 07-Oct-1999 01:46 2.2M            
26   R-0.90.0 22-Nov-1999 18:07 2.3M            
27   R-0.90.1 15-Dec-1999 14:05 2.4M            
28   R-0.99.0 07-Feb-2000 13:09 2.8M            
29  R-0.99.0a 09-Feb-2000 12:28 2.8M    
 

7voto

Ari B. Friedman Points 24940

Et en s'appuyant sur le travail déjà accompli:

 h <- getRdates()
# Find version release rate
library(plyr)
h <- subset(h,select=c(-Description))
Version <- sub("^R-([0-9a-z.-]+)\\.t.*","\\1",h$Name)
h$bigVersion <- as.numeric(sub("^([0-9])\\..+","\\1",Version))
h$smallVersion <- as.numeric(sub("^[0-9]\\.([0-9]+).+","\\1",Version))
h$majorVersion <- as.numeric(paste(h$bigVersion,sprintf( "%02.0f", h$smallVersion ),sep="."))
h <- ddply( h, .(bigVersion,majorVersion), function(x) {
    x$tinyVersion <- seq(nrow(x))
    x
})

# Plot
plot( majorVersion~Date, data=h, pch=".",cex=3)
abline(h=seq(1,2),col="red")
 

les taux

 library(lattice)
print(xyplot( smallVersion~Date|bigVersion, data=h, pch=".",cex=3))
 

treillis

Et en comparant tous ensemble:

 h <- ddply( h, .(bigVersion), function(x) {
   x$bigElapsedTime <- x$Date - min(x$Date)
   x
})

png("c:/temp/Rplot3.png")
plot( smallVersion~bigElapsedTime, data=h, pch=".",cex=3,col=h$bigVersion+1)
dev.off()
 

le tout sur un seul terrain

 # How many minor releases per major release

> table(rle(h$majorVersion)$lengths, substring(rle(h$majorVersion)$values,1,1))

    0 1 2
  1 1 0 0
  2 5 5 9
  3 1 1 6
  4 2 4 1
  5 1 0 0
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X