Estrarre dati dagli indici di Google

Google IndexIeri ero alle prese con un sito e le pagine indicizzate da Big G. Sfortunatamente il big motore, tanto potente per molte cose, é piuttosto limitato per molte altre, come ad esempio il comando site.

Per dirla tutta, non é il comando ad essere limitato, piuttosto la mancanza di esportare i risultati ottenuti dall’operatore in formato tabulare per successive elaborazioni.

A Google non piace che qualcuno metta le mani sui suoi indici a quanto pare, tanto é vero che pur dando un occhio alle API o delle librerie per Python (che in questo caso si sarebbero rivelate una manna dal cielo) la possibilità di esportazione sarebbe stata limitata a 64 risultati nel primo caso (precedentemente mille??) e ad ore di lettura per ottenere non so nemmeno io cosa nel secondo.

Insomma niente di allettante per un venerdì pomeriggio.

Ecco allora che il lavorare di nuovo con Windows e con Excel 2007 si poteva dimostrare la chiave di volta. Ricordavo tempo addietro di aver letto qualche articolo dove Excel permetteva ora di aprire documenti dal web e fare il parsimg dei dati.

Speravo in qualcosa di flessibile come WebSundew che avevo usato in passato, il quale permette di definire delle aree di lettura sulla base di template, definire dove si trova il sistema di paginazione e simulare una navigazione utente al contempo facendo il grabbing del contenuto.
Purtroppo nulla di tutto ciò., Microsoft Excel fallisce miseramente, e anzi sono rimasto profondamente deluso (davvero?! forse me lo dovevo aspettare) dal vedere un misero import fatto con IE funziona, mentre di Firefox proprio non se ne parla.

No, avevo bisogno di qualcosa di differente che per fortuna qualcuno ha pensato di fare.

VB ScriptUna funzione VBscript per Excel, che utilizzano un oggetto XmlHTTP per fare chiamate tramite le DOM API attraverso linguaggi di programmazione (tipo il VBScript) e delle chiamate a l’oggetto Regular expression, ha fatto il lavoro “sporco” in poche decine di secondi, alla mercé di una navigazione utente.

La pagina dove ho trovato lo script era priva di documentazione, ma la mia passata esperienza in Asp e Vb6 mi dono stati d’aiuto.

Quello che bisogna fare é semplicemente definire il nome a quattro celle tramite la casella per assegnare il nome ad un gruppo di celle, incollare lo script di seguito riportato e attendere che i dati compaiano a schermo.
I nomi che dovrete assegnare sono i seguenti:

  • SEARCH_URL: che contiene l’URL con la query esatta in cui ricercare il testo
  • SEARCH_TERM: che contiene la stringa da ricercare nella pagina estratta
  • GOOGLE_PAGE: che contiene il numero di pagine di cui bisogna fare il parsing
  • FIRST_URL_HERE: che è la cella da dove inizieranno ad essere scritti i risultati

Consiglio di non abusare dello script, sebbene via sia una funzione di timer che permette di dilazionare le chiamate, intervallandole con una pausa che nello script che segue ho innalzato un pochino come tempistica, portandolo tra i 10 e i 15 secondi.

L’implementazione non é difficile, ma la flessibilità lascia un pochino a desiderare se vi aspettate uno strumento “cotto e mangiato”.
Ma per quello che dovevo fare io, ovvero una audit sul numero di link presenti negli indici di Google, non posso che ringraziare l’autore, riproponendo lo script integrale, sperando che sia utile a qualcuno.


Sub Parse_Google_Search_Results_Pages_For_URLs()

‘**************************************************
‘************** Code by Excel_Geek ****************
‘**************************************************

‘ This Excel macro calls up search results pages of
‘ a Google search using a search term specified in a
‘ cell named “SEARCH_TERM”. Then it uses a regular
‘ expression to glean from this page all of the
‘ webpage addresses (URLs) of the search results and
‘ places them in a list in the spreadsheet.

‘ Setting up the regular expression that recognizes
‘ search result URLS on Google pages.
‘ The regular expression also ingores case, which by
‘the way, i convert all to lower in the end.

Set regEx = CreateObject(“VBScript.regexp”)
regEx.Global = True
regEx.IgnoreCase = True
regEx.Pattern = “””http://([^6″”]+)”””

‘ Now I reformat the search term as typed into the
‘search term as used in Google search query URLs.
‘ i.e. I replace spaces with pluses and quote marks
‘with %22s.

Range(“SEARCH_TERM”).Select
Selection.Replace What:=””””, Replacement:=”%22″,
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _
SearchFormat:=False, ReplaceFormat:=False
Selection.Replace What:=” “, Replacement:=”+”, _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _
SearchFormat:=False, ReplaceFormat:=False

‘ Set the top limit on the Google page of results to parse.
Pages = Range(“GOOGLE_PAGE”).Value

‘ Need this, apparently, to generate random numbers…
‘ which we’ll need at the bottom of this next FOR_NEXT…
Math.Randomize

‘ Create a FOR_NEXT loop to get all pages.
For x = 1 To Pages
‘ Set the GOOGLE_PAGE value to the page to parse.
Range(“GOOGLE_PAGE”).Select
ActiveCell.FormulaR1C1 = x

‘ Selected the SEARCH_URL, as this will need to be
‘passed to the objHTTP.Open command.
Range(“SEARCH_URL”).Select

‘ Get the page using the objHTTP object.
Set objHTTP = CreateObject(“MSXML2.ServerXMLHTTP”)
objHTTP.Open “GET”, Selection.Value, False
objHTTP.setRequestHeader “User-Agent”, _
“Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)”
objHTTP.send (“”)

‘ Define the pageToParse as teh response text of
‘the “GET” method.

pageToParse = objHTTP.responseText

‘ Clear the objHTTP object.
Set objHTTP = Nothing
‘ Set expressionmatch as the strings matched using
‘ the regular expression defined above.
Set expressionmatch = regEx.Execute(pageToParse)

For Each expressionmatched In expressionmatch

‘ Got to get rid of any results on Google’s servers.
If InStr(1, expressionmatched, “google”, 1) > 0 Then

GoTo MOVE_ON

Else

Range(“FIRST_URL_HERE”).Select
ActiveCell.FormulaR1C1 = _
LCase(Left(Mid((expressionmatched), 2, 300), _
Len(expressionmatched) – 2))
Selection.Offset(1, 0).Select
ActiveWorkbook.Names.Add Name:=”FIRST_URL_HERE”, _
RefersToR1C1:=Selection

End If
MOVE_ON:

Next

‘ Setting up code to pause by a random amount of time
‘ between 10 and 15 seconds between pages of results.
Dim newHour, newMinute, newSecond, waitTime
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + Int((15 – 10 + 1) * Math.Rnd + 4)
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime

Next x

End Sub

Update del 24/03/10: Sfortunatamente testando meglio il codice sopra mi sono reso conto che funziona solo parzialmente. Sebbene si possano specificare il numero di pagine da analizzare, il codice è totalmente privo di un sistema per passare alla pagina successiva. Io ho lavorato e ottenuto una nuova versione del codice qui sopra, ma dato che l’ho fatto durante l’orario di lavoro non potrò divulgare il codice.

Si tratta comunque di modifiche che un programmatore medio può riuscire a fare in una giornata di lavoro.

Technorati Tags: google, serp, site, excel