2014-07-04 23 views
6

Sto provando a scrivere il codice che andrà ad ogni pagina e prendere informazioni da lì. Url < - http://www.wikiart.org/en/claude-monet/mode/all-paintings-by-alphabetCome scrivere codice su web crawling e scraping in R

Ho il codice per emettere tutti gli hrefs. Ma non funziona.

library(XML) 
library(RCurl) 
library(stringr) 
tagrecode <- readHTMLTable ("http://www.wikiart.org/en/claude-monet/mode/all-   paintings-by-alphabet") 
tabla <- as.data.frame(tagrecode) 
str(tabla) 
names (tabla) <- c("name", "desc", "cat", "updated") 
str(tabla) 
res <- htmlParse ("http://www.wikiart.org/en/claude-monet/mode/all-paintings-by- alphabet") 
enlaces <- getNodeSet (res, "//p[@class='pb5']/a/@href") 
enlaces <- unlist(lapply(enlaces, as.character)) 
tabla$enlace <- paste("http://www.wikiart.org/en/claude-monet/mode/all-paintings-by- alphabet") 
str(tabla) 
lisurl <- tabla$enlace 

fu1 <- function(url){ 
print(url) 
pas1 <- htmlParse(url, useInternalNodes=T) 

pas2 <- xpathSApply(pas1, "//p[@class='pb5']/a/@href") 
} 
urldef <- lapply(lisurl,fu1) 

dopo aver elenco degli URL di tutte le immagini di questa pagina voglio andare al secondo-terzo -...- 23 pagine per raccogliere gli URL di tutte le immagini.

Passaggio successivo per recuperare informazioni su ogni immagine. Ho un codice funzionante per uno e ho bisogno di costruirlo in un codice generale.

library(XML) 
url = "http://www.wikiart.org/en/claude-monet/camille-and-jean-monet-in-the-garden-at-argenteuil" 
doc = htmlTreeParse(url, useInternalNodes=T) 
pictureName <- xpathSApply(doc,"//h1[@itemprop='name']", xmlValue) 
date <- xpathSApply(doc, "//span[@itemprop='dateCreated']", xmlValue) 
author <- xpathSApply(doc, "//a[@itemprop='author']", xmlValue) 
style <- xpathSApply(doc, "//span[@itemprop='style']", xmlValue) 
genre <- xpathSApply(doc, "//span[@itemprop='genre']", xmlValue) 

pictureName 
date 
author 
style 
genre 

Ogni consiglio su come farlo sarà apprezzato!

risposta

9

Questo sembra funzionare.

library(XML) 
library(httr) 
url <- "http://www.wikiart.org/en/claude-monet/mode/all-paintings-by-alphabet/" 
hrefs <- list() 
for (i in 1:23) { 
    response <- GET(paste0(url,i)) 
    doc  <- content(response,type="text/html") 
    hrefs <- c(hrefs,doc["//p[@class='pb5']/a/@href"]) 
} 
url  <- "http://www.wikiart.org" 
xPath <- c(pictureName = "//h1[@itemprop='name']", 
       date  = "//span[@itemprop='dateCreated']", 
       author  = "//a[@itemprop='author']", 
       style  = "//span[@itemprop='style']", 
       genre  = "//span[@itemprop='genre']") 
get.picture <- function(href) { 
    response <- GET(paste0(url,href)) 
    doc  <- content(response,type="text/html") 
    info  <- sapply(xPath,function(xp)ifelse(length(doc[xp])==0,NA,xmlValue(doc[xp][[1]]))) 
} 
pictures <- do.call(rbind,lapply(hrefs,get.picture)) 
head(pictures) 
#  pictureName       date  author   style   genre   
# [1,] "A Corner of the Garden at Montgeron" "1877" "Claude Monet" "Impressionism" "landscape"  
# [2,] "A Corner of the Studio"    "1861" "Claude Monet" "Realism"  "self-portrait" 
# [3,] "A Farmyard in Normandy"    "c.1863" "Claude Monet" "Realism"  "landscape"  
# [4,] "A Windmill near Zaandam"    NA  "Claude Monet" "Impressionism" "landscape"  
# [5,] "A Woman Reading"      "1872" "Claude Monet" "Impressionism" "genre painting" 
# [6,] "Adolphe Monet Reading in the Garden" "1866" "Claude Monet" "Impressionism" "genre painting" 

Eri davvero vicino. Il tuo xPath va bene; un problema è che non tutte le immagini hanno tutte le informazioni (ad esempio, per alcune delle pagine che i nodi che stai tentando di accedere sono vuote) - nota la data di "A Windnill nead Zaandam". Quindi il codice deve fare i conti con questa possibilità.

Quindi in questo esempio, il primo ciclo acquisisce i valori dell'attributo href dei tag di ancoraggio per ogni pagina (1:23) e li combina in un vettore di lunghezza ~ 1300.

Per elaborare ognuna di queste 1300 pagine e poiché abbiamo a che fare con tag mancanti, è più semplice creare un vettore contenente le stringhe xPath e applicare tale elemento in ogni pagina. Questo è ciò che fa la funzione get.picture(...). L'ultima istruzione chiama questa funzione con ciascuno dei 1300 hrefs e lega il risultato insieme in termini di righe, usando do.call(rbind,...).

Si noti inoltre che questo codice utilizza la funzione di indicizzazione un po 'più compatta per gli oggetti di classe HTMLInternalDocument: doc[xpath] dove xpath è una stringa xPath. Ciò evita l'uso di xpathSApply(...), sebbene quest'ultimo avrebbe funzionato.

0

Si può provare Rcrawler package, si tratta di un raschietto web parallelo, può eseguire la scansione, archiviare pagine Web e raschiare il contenuto utilizzando XPath.

Se è necessario raccogliere tutte le immagini le informazioni utilizzare

datapattern<-c(
    "//h1/span[@itemprop='name']", 
    "//a[@class='artist-name']", 
    "//*[@id='headSection']/article/form/div[1]/div/div/div[2]/div[2]/span[2]", 
    "//*[@id='headSection']/article/form/div[1]/div/div/div[2]/div[3]/a/span", 
    "//*[@id='headSection']/article/form/div[1]/div/div/div[2]/div[4]/a/span" 
) 

Rcrawler(Website = "https://www.wikiart.org/", no_cores = 4, no_conn = 4, ExtractPatterns =datapattern) 

per filtrare solo Claud Monet immagine

Rcrawler(Website = "https://www.wikiart.org/", no_cores = 4, no_conn = 4, urlregexfilter ="claude-monet/([^/])*", ExtractPatterns =datapattern) 

Il crawler prendere alcune volte per finire come sarà attraversare tutti i link di siti web. Tuttavia, è possibile interrompere l'esecuzione in qualsiasi momento. Per impostazione predefinita, raschiato si trova in un viariabile globale denominato DATA, un'altra variabile denominata INDICE contiene tutti gli URL sottoposti a ricerca per indicizzazione.

Se è necessario imparare come costruire il crawler, fare riferimento a questo documento. R crawler