2012-02-15 7 views
10

GoalR mostra diversa HTML (se confrontato al browser web) per lo stesso Google Search URL

Vorrei utilizzare R per scaricare il codice HTML di una pagina web di ricerca di Google, come mostrato in un browser web.

Problema

Quando scarico di Google di ricerca HTML pagina web in R, utilizzando esattamente lo stesso URL dal browser web, ho notato che la R scaricato HTML è diverso per il browser web HTML per esempio per un URL di ricerca Google avanzato, il parametro data viene ignorato nell'HTML letto da R mentre nel browser Web viene mantenuto.

Esempio

Faccio una ricerca su Google nel mio browser web per "West End Theatre" e specificare un intervallo di date di 1 gennaio - 31 gennaio 2012. Ho quindi copiare l'URL generato e incollarlo in R .

# Google Search URL from Firefox web browser 
url <- "http://www.google.co.uk/search?q=west+end+theatre&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-GB:official&client=firefox-a#q=west+end+theatre&hl=en&client=firefox-a&hs=z7I&rls=org.mozilla:en-GB%3Aofficial&prmd=imvns&sa=X&ei=rJE7T8fwM82WhQe_6eD2CQ&ved=0CGoQpwUoBw&source=lnt&tbs=cdr:1%2Ccd_min%3A1%2F1%2F2012%2Ccd_max%3A31%2F1%2F2012&tbm=&bav=on.2,or.r_gc.r_pw.r_qf.,cf.osb&fp=6f92152f78004c6d&biw=1600&bih=810" 
u <- URLdecode(url) 

# Webpage as seen in browser 
browseURL(u) 

# Webpage as seen from R 
HTML <- paste(readLines(u), collapse = "\n") 
cat(HTML, file = "output01.html") 
shell.exec("output01.html") 

# Webpage as seen from R through RCurl 
library(RCurl) 
cookie = 'cookiefile.txt' 
curl = getCurlHandle(cookiefile = cookie, 
        useragent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en - US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6", 
        header = FALSE, 
        verbose = TRUE, 
        netrc = TRUE, 
        maxredirs = as.integer(20), 
        followlocation = TRUE, 
        ssl.verifypeer = TRUE, 
        cainfo = system.file("CurlSSL", "cacert.pem", package = "RCurl")) 
HTML2 <- getURL(u, curl = curl) 
cat(HTML2, file = "output02.html") 
shell.exec("output02.html") 

eseguendo il codice di self-contained sopra posso vedere che la prima pagina web che si apre è quello che voglio (con il parametro della data forzata), ma il secondo e terzo pagine web che si aprono (come scaricati tramite R) ha il parametro data ignorato.

Domanda

Come posso scaricare il codice HTML per la prima pagina web che si apre al posto delle seconde pagine web terzo /?

System Information

> sessionInfo() 
R version 2.14.0 (2011-10-31) 
Platform: x86_64-pc-mingw32/x64 (64-bit) 

locale: 
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252 LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C       
[5] LC_TIME=English_United Kingdom.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] RCurl_1.6-10.1 bitops_1.0-4.1 

loaded via a namespace (and not attached): 
[1] tools_2.14.0 
+0

URLDecode è prima di rendere necessaria la richiesta? –

+0

@MattBridges Purtroppo si. Ad esempio, quanto segue produce pagine Web diverse, sulla base del codice sopra, quando inserito in R: browseURL (url); browseURL (u) –

+1

Credo che Google utilizzi AJAX per ricaricare i risultati con le opzioni di filtro attivate. 'readLines' e' getURL' ottengono la pagina prima dei risultati di ogni chiamata AJAX. – jbaums

risposta

2

Invece di cercare di decodificare i risultati delle pagine di ricerca di Google, si può semplicemente utilizzare il Custom Search API. Dopo aver ottenuto una chiave API, sarai in grado di specificare i criteri di ricerca attraverso l'URL e ricevere un file JSON invece di dover decodificare l'HTML. Il pacchetto rjson ti aiuterà a leggere il file JSON in un oggetto R e ad estrarre i dati rilevanti.

Sarai limitato a 1000 query al giorno, ma potrebbe essere molto più semplice da utilizzare.

MODIFICA: in particolare, l'API di ricerca personalizzata è stata deprecata.

+0

Questa è in teoria una buona congestione e qualcosa che ho esaminato Tuttavia, il problema principale che ho riscontrato con l'API di ricerca personalizzata di Google è che non è coerente con i risultati restituiti da, ad esempio, da Google.com che è alquanto fastidioso. Per citare Google "è improbabile che i risultati corrispondano a quelli restituiti da Ricerca Web di Google" - riferimento: http://www.google.com/support/customsearch/bin/answer.py?hl=it&answer=141877 –

+0

Sembra che link sta parlando in modo specifico della ricerca di pagine specifiche, prova la deprecata [Web Search API] (https://developers.google.com/web-search/) per effettuare ricerche in tutto il web. – blahdiblah

+0

È un'idea interessante lavorare con quell'API, ma dato il suo stato di svalutazione, sarei riluttante a investire tempo in esso. In questo caso è necessaria una soluzione long-timer più robusta (anche se sono stato completamente colpito da un muro di mattoni su questo se sono onesto, poiché trovo difficile comprendere i pacchetti Spidermonkey e RFirefox su omegahat.com che sembravano promettenti). –

2

Parte del problema è che Google has profiled you e restituisce corrispondenze in base a ciò che sa dalle ricerche precedenti, discussioni su gmail, utilizzo di google maps, indirizzo IP, dati sulla posizione, annunci visualizzati, contatti social e altri servizi. Alcuni di questi casi si verificano anche se non si dispone di un account Google.

Personalizzazione con accesso eseguito: quando hai eseguito l'accesso a un account Google con la Cronologia web, Google personalizza la tua esperienza di ricerca in base a ciò che hai cercato e sui siti che hai visitato in il passato.

Firmato-out personalizzazione: Quando non hai eseguito l'accesso, Google personalizza la tua esperienza di ricerca in base alle informazioni sulle ricerche precedenti associate al tuo browser, utilizzando un cookie. Google memorizza fino a 180 giorni di ricerca annullata attività collegata al cookie del browser, comprese le query e i risultati clic.

L'unico modo per rendere i risultati automatici corrispondenti a quello manuale è cercare di associare il profilo. Per lo meno dovresti provare a inviare la stessa stringa User-Agent del tuo browser e gli stessi cookie. Puoi scoprire quali sono, annusando le tue richieste HTTP sulla rete o utilizzando un componente aggiuntivo del browser come le intestazioni HTTP in tempo reale.

Per quanto riguarda il motivo per cui la data viene filtrata credo che il commento di jbaums lo copra. Ci sono alcune cose sul lato client che gestiscono il filtraggio e risultati-while-you-type. Potrebbe esserci un modo per aggirare questo, anche se puoi attivare la vecchia interfaccia di googles prima che fosse aggiunto il materiale AJAX. Guarda cosa ottieni da Google nel tuo browser se disabiliti Javascript.