Ich versuche, eine große Anzahl von Webseiten zu kratzen, um sie später zu analysieren. Da die Anzahl der URLs riesig ist, habe ich beschlossen, das parallel
Paket zusammen mit XML
zu verwenden.Mit der Parallelisierung von Webseiten mit R
Insbesondere Ich bin mit der htmlParse()
Funktion von XML
, der gut arbeitet, wenn sie mit sapply
verwendet, sondern erzeugt leere Objekte der Klasse HTMLInternalDocument, wenn sie mit parSapply
verwendet.
url1<- "http://forums.philosophyforums.com/threads/senses-of-truth-63636.html"
url2<- "http://forums.philosophyforums.com/threads/the-limits-of-my-language-impossibly-mean-the-limits-of-my-world-62183.html"
url3<- "http://forums.philosophyforums.com/threads/how-language-models-reality-63487.html"
myFunction<- function(x){
cl<- makeCluster(getOption("cl.cores",detectCores()))
ok<- parSapply(cl=cl,X=x,FUN=htmlParse)
return(ok)
}
urls<- c(url1,url2,url3)
#Works
output1<- sapply(urls,function(x)htmlParse(x))
str(output1[[1]])
> Classes 'HTMLInternalDocument', 'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument', 'oldClass' <externalptr>
output1[[1]]
#Doesn't work
myFunction<- function(x){
cl<- makeCluster(getOption("cl.cores",detectCores()))
ok<- parSapply(cl=cl,X=x,FUN=htmlParse)
stopCluster(cl)
return(ok)
}
output2<- myFunction(urls)
str(output2[[1]])
> Classes 'HTMLInternalDocument', 'HTMLInternalDocument', 'XMLInternalDocument', 'XMLAbstractDocument', 'oldClass' <externalptr>
output2[[1]]
#empty
Danke.
Jemand mehr Wissen wird hoffentlich in läuten, aber meine Intuition ist, dass diese Parallelisierung (wie sie derzeit entwickelt) möglicherweise nicht so effizient, weil Sie die Websites direkt in "htmlParse" aufrufen und alle Ihre Kerne wahrscheinlich eine einzige Verbindung mit dem Internet teilen. Sie können RCurl für [asynchrone Downloads suchen, die angeblich effizienter sind] (http://www.inside-r.org/packages/cran/RCurl/docs/getURIAsynchronous). – Thomas
@Thomas Danke. Wie in den vorherigen Fragen haben Sie mir geholfen, ich begrüße Ihre Vorschläge/Kommentare. Ich werde auch in RCurl schauen. –
Beachten Sie auch, dass, wenn Ihre einzelnen WebScrapes nicht so lange dauern (Bestellung ms), der Overhead der Parallelisierung dazu führt, dass es länger dauert als die einfache Verarbeitung in der Serie. –