Siete qui:

  1. Home
  2. Blog
  3. Google hack: order results by date

Google hack: order results by date

Alessandro Scoscia • 13 ottobre 2008 18:37

Magari non ci avete mai fatto caso ma tra i parametri di ricerca offerti da Google non c'è l'ordinamento per data. Non riesco a spiegarmi per quale motivo non ci sia questa feature, ma non credo sia un problema tecnico. Di fatto i risultati di qualunque ricerca vengono ordinati esclusivamente per rilevanza.

In alcuni casi sarebbe molto comodo visualizzare i risultati delle ricerche eseguite su Google per data. Dando per scontato che non si possa intervenire lato server (anche se si potrebbero immaginare soluzioni che utilizzino un altro server come proxy-collettore), l'unica possibilità di interazione con i dati è quella di intervenire lato client, nel browser.

Firefox ha tra le proprie estensioni un plugin davvero molto potente che permette di inserire codice javascript arbitrario nel documento: Greasemonkey. Con questo strumento quindi è possibile fare “javascript injection” e modificare comportamenti ed aspetto di una pagina.

La soluzione che propongo sfrutta greasemonkey per inserire del codice nel documento caricato dal browser che permetta di analizzarne i contenuti, riordinarli per data ed eseguirne una nuova impaginazione. Per realizzare questi step è molto comodo avere a disposizione Jquery che consente in modo molto semplice di gestire il dom del documento.

Osservando i dati forniti da una ricerca in Google si nota subito che non vi è traccia di riferimenti temporali nelle informazioni ricevute. Per forzare i server di Google ad inserire queste informazioni, fondamentali per l'ordinamento per data, dobbiamo sfruttare un piccolo hack, modificando opportunamente la querystring della richiesta.

Vediamo, passo passo, come conviene procedere:

  1. Iniettiamo nella pagina del codice che consente il caricamento di Jquery (direttamente dal server di JQuery)
  2. Verifichiamo se la richiesta è stata fatta chiedendo l'inserimento delle date nelle risposte, eventualmente forziamo il browser ad eseguirla di nuovo modificando opportunamente i parametri della richiesta
  3. Facciamo le stesse verifiche per ottenere pagine con un numero di risposte congruo. Il default in Google è 10. Noi imposteremo questo valore a 20 (il limite teorico di 100, indicato da Google nella propria documentazione, viene ignorato dai server)
  4. Analizziamo la pagina inviata da Google, trasformiamo le indicazioni temporali scritte nella pagina in date
  5. Riordiniamo le risposte di Google per data
  6. Ricomponiamo la pagina spostando opportunamente le notizie per rispettare il nuovo ordinamento

Analizziamo ora separatamente questi passi:

Iniettiamo nella pagina del codice che consente il caricamento di Jquery

Possiamo eseguire questo passo creando nella pagina un nuovo elemento “script” di tipo javascript che carichi il proprio codice dal server di jquery. L'elemento appena creato deve poi essere inserito nel dom della pagina appendendolo nell'header. Ovviamente non possiamo conoscere preventivamente il tempo necessario al browser per eseguire questo caricamento ma non sarà certo istantaneo. Ciò significa che non possiamo immediatamente eseguire codice jquery ma dobbiamo verificare, ad intervalli di tempo regolari, quando jquery è stato inizializzato.

  • var GM_JQ = document.createElement('script');
  • GM_JQ.src="http://jquery.com/src/jquery-latest.js"
  • mce_src="http://jquery.com/src/jquery-latest.js"
  • GM_JQ.type = 'text/javascript';
  • document.getElementsByTagName('head')[0].appendChild(GM_JQ);
  • // Check if jQuery's loaded
  • function GM_wait() {
    • if(typeof unsafeWindow.jQuery == 'undefined') {
      • window.setTimeout(GM_wait,100);
    • } else {
      • $ = unsafeWindow.jQuery; letsJQuery();
    • }
  • }
  • GM_wait();

Verifichiamo se la richiesta è stata fatta chiedendo l'inserimento delle date nelle risposte, eventualmente forziamo il browser ad eseguirla di nuovo modificando opportunamente i parametri della richiesta

L'hack che consente di forzare la scrittura dei riferimenti temporali (purtroppo non sono sempre date ma anche stringhe del tipo “5 ore fa”) consiste nell'aggiungere alla url “&as_qdr=y” che forza il server a limitare le ricerche alle sole risposte dell'ultimo anno. Dato che questa indicazione può andare in conflitto con altre eventualmente già presenti nella querystring, dovremmo eliminare tutte le richieste in contraddizione.

  • orderByDateExpr = /&as_qdr=y/i;
  • searchDateExpr = url.search(orderByDateExpr);
  • if (searchDateExpr == -1) {
    • url = url.replace(/&as_qdr=./i,'');
    • document.location.href = url+'&as_qdr=y&num=20';
  • }

Facciamo le stesse verifiche per ottenere pagine con un numero di risposte congruo.

Possiamo forzare Google ad inviare almeno 20 risposte in una pagina, aggiungendo “&num=20” alla querystring (anche in questo caso rimuovendo le eventuali richieste contraddittorie).

  • resultPerPageExpr = /&num=20/i;
  • searchPerPageExpr = url.search(resultPerPageExpr);
  • if (searchPerPageExpr == -1) {
    • url = url.replace(/&num=\d{2,3}/i,'')
    • document.location.href = url+'&as_qdr=y&num=20';
  • }

Analizziamo la pagina inviata da Google, trasformiamo le indicazioni temporali scritte nella pagina in date

L'analisi della pagina così caricata nel browser può essere eseguita in modo abbastanza semplice con jquery. La lettura del codice xhtml della pagina consente di verificare che le risposte sono contenute in un tag “li” di una lista ordinata (tag “ol”) contenuta in un "div" innestato nel div di id “res”. Eseguiamo quindi una funzione che aggiunga ognuno di questi tag "li" in un array e che, per ognuno, analizzi il primo tag “font” innestato per recuperare la data. La data è scritta in formato stringa (in italiano nel mio caso). Ciò obbliga a scrivere qualche riga di codice per effettuare una corretta conversione della data dal formato stringa a date (funzione “it_date_convert” nel codice di esempio). L'indicazione della data viene aggiunta all'array di oggetti che servirà per l'ordinamento. Ogni elemento “li” analizzato, viene rimosso dal dom (scomparendo così temporaneamente dalla visualizzazione).

  • $("#res > div > ol > li.g").each(function(index){
    • date=$(this).find("font").html();
    • date=it_date_convert(date);
    • results.push(new Object({"indice":index,"data":date,"li":this}));
    • $(this).remove();
  • });

Riordiniamo le risposte di Google per data

L'ordinamento delle informazioni per data viene realizzato utilizzando bubble-sort sull'array di oggetti creato al passo precendente. L'algoritmo di ordinamento bubble-sort è molto semplice da realizzare e, anche se non particolarmente efficiente, è eseguito in tempi più che accettabili su insiemi di massimo 20 elementi.

  • for (var j=results.length-1; j>0; j--) {
    • for (var i=0; i<j; i++) {
      • if (results[i+1].data>results[i].data) {
        • var ttemp=results[i+1];
        • results[i+1]=results[i];
        • results[i]=ttemp;
      • }
    • }
  • }

Ricomponiamo la pagina spostando opportunamente le notizie per rispettare il nuovo ordinamento

Come ultimo passo riappendiamo al tag “ol” selezionato in precedenza tutti i tag “li” (contenenti le informazioni) che abbiamo appena riordinato. La pagina sarà così visualizzata con il nuovo ordinamento.

  • for (var j=0; j<results.length; j++) {
    • $("#res > div > ol").append(results[j].li);
  • }

Anche se questo script non è che una “soluzione base”, senza troppe feature, è già funzionante ed è possibile attivarlo o disattivarlo utilizzando l'apposita icona di greasemonkey.

Il codice completo è disponibile qui.

Commenti

Inviato da Alessandro Scoscia il 19 ottobre 2008 12:32
Con l'intenzione di scrivere una soluzione server-side al problema dell'ordinamento per data dei risultati delle ricerche in Google, mi sono letto le condizioni di utilizzo delle "Google AJAX Search API".
Ho scoperto, purtroppo, che questa soluzione non si può adottare poiché espressamente vietata (al primo caso del punto 1.3 lettera a ):

"You agree that you will not, and you will not permit your users or other third parties to: (a) modify or replace the text, images, or other content of the Google Search Results, including by (i) changing the order in which the Google Search Results appear, (ii) intermixing Search Results from sources other than Google, or (iii) intermixing other content such that it appears to be part of the Google Search Results; or (b) modify, replace or otherwise disable the functioning of links to Google or third party websites provided in the Google Search Results."
Inserisci un commento

I campi contrassegnati con " * " sono obbligatori




Creative Commons License Valid XHTML 1.1 Valid CSS [Valid RSS] Powered by SmartControl