serp di google

Moltiย SEO specialist hanno un passato (o un presente) da programmatori. Questo guest post, scritto da Matteo Boffoย (un appassionato e studioso di contenuti autogenerati e spam engine), รจ dedicato proprio a chiย mangia quotidianamenteย “pane e codice”: si tratta di una una piccola “guida”/tool scritto in PHP, facilmente adattabile per seguire una o piรน query su Google, e avere l’andamento nel tempo della posizione di un dominio per quella query; il toolย riesce a trovare il dominio cercato dalla posizione 1 alla posizione 9999.

Obiettivo di questa guida รจ fornire un metodo semplice per seguire il posizionamento di un certo dominio per un certo numero di query di ricerca in Google. Premetto che questo script non necessita di una API_Key da richiedere sul sito di Google quindi lo possono provare tutti senza registrazioni varie ecc… Lo dovete vedere con unโ€™ottica di tutorial, lo script รจ migliorabile in tanti punti ma come guida e punto di partenza puรฒ bastare. I requisiti necessari sono:

  • un server web (Apache) con interprete PHP (con modulo CURL attivato)
  • MySQL (una versione anche non molto recente in quanto non si fa uso di particolari caratteristiche)
  • la libreria simplehtmldom scaricabile dal sito http://simplehtmldom.sourceforge.net/

Personalmente uso, su una macchina con SO Windows XP, il pacchetto XAMPP che, in maniera semplice e veloce mi mette a disposizione i requisiti necessari sopra descritti (la libreria va scaricata). Nel seguente schema potete vedere lโ€™architettura dellโ€™applicazione:

Architettura dellโ€™applicazione

Vediamo innanzitutto le tabelle contenute nel database (colore giallo nello schema)

Nel database ci sono due tabelle:

  1. query_mdr che contiene un unico campo (query) che contiene tutte le query che vogliamo analizzare
  2. serp che contiene lo storico delle serp prelevate

Il dump della struttura della tabella query_mdr che serve a noi รจ il seguente:

SET SQL_MODE=”NO_AUTO_VALUE_ON_ZERO”;ย 

CREATE TABLE `query_mdr` (

ย  “>`query` varchar(255) character set utf8 NOT NULL,

  PRIMARY KEY  (`query`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

Nel campo query andremo ad inserire le query. Ad esempio un possibile contenuto della tabella potrebbe essere:

abbigliamento casual
Abbigliamento estivo
Jeans corti
…..

Il dump della struttura della tabella serp che serve a noi รจ il seguente:

“>SET SQL_MODE=”NO_AUTO_VALUE_ON_ZERO”;

CREATE TABLE `serp` (

N-GB”>ย  `query` varchar(255) character set utf8 NOT NULL,

  `rilevazione` varchar(12) character set utf8 NOT NULL,

  `posizione` int(11) NOT NULL,

  `urlserp` varchar(255) character set utf8 NOT NULL,

ย 

“>PRIMARY KEYย  (`query`,`rilevazione`)

ng=”EN-GB”>) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

Come potete vedere la tabella รจ la seguente:

queryrilevazioneposizioneurlserp
abiti+eleganti+premaman2008060600529www…..

Analizziamo i quattro campi: </p>
<ul>

  • query: contiene la query da chiedere a Google. Gli spazi sono cambiati nel carattere โ€˜+โ€™
  • rilevazione: รจ formata da una stringa anno-mese-giorno-ora-minuti. Ho sceltoย di non utilizzare un campo di tipo data, ma una stringa in formato iso per semplicitร  e perchรฉ riesco a gestirmi meglio lโ€™informazione contenuta nelย campo (si puรฒ essere dโ€™accordo o meno su questa scelta ma ricordo che questoย script รจ un prototipo)
  • posizione: la posizione nella serp ritornata da Google. Questo script segueย dalla posizione 1 alla 9999
  • urlserp: questo campo contiene lโ€™url presentato da Google e ad oggi scritto in verde sottoย alla descrizione del risultato (vedi immagine)

URL presentato da Google

<strong>Vediamo ora lo script in PHP che gestisce il tutto (colore verde nello schema) Prima di vedere il codice sorgente e commentarlo vi dico subito che lo script gira per circa unโ€™ora in maniera continuativa. Il carico sul server non รจ elevato in quanto ha dei tempi โ€œmortiโ€ casuali per non fare troppe richieste al server di Google, in quanto questโ€™ultimo altrimenti blocca lโ€™accesso allo scaricamento della pagina.

Lo script va lanciato un paio di volte al giorno (va beh, decidete voi quando), ovviamente questo dipende da quante query volete analizzare. Vediamo ora il codice sorgente (ckground: yellow”>i commenti sono ingiallo, le parti da modificare perpersonalizzare lo script in rosso):

ย ” lang=”EN-GB”><?php

  //definisco una funzione per recuperare una pagina tramite il modulo CURL

  function get_url_contents($url){

    $crl = curl_init();

    $timeout = 10;

    curl_setopt ($crl, CURLOPT_URL,$url);

    curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt ($crl, CURLOPT_CONNECTTIMEOUT, $timeout);

    curl_setopt ($crl, CURLOPT_USERAGENT, “Firefox (WindowsXP) – Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6”);

GB”>    $ret = curl_exec($crl);

    curl_close($crl);

    ily: ‘Courier New'”>return $ret;

  } 

  //Mi serve per far durare lo script non piรน di 1 ora

  $inizio_time = time();

  include(‘./simple_html_dom.php’);//richiamo la libreria simplehtmldom

  $conn_database = mysql_connect(‘localhost’,’xxxxx‘,’aaaaa‘) or die(‘Impossibile connettersi al server MySQL.’);nd: yellow”>//primo parametro->nome utente; secondo parametro->password per collegarsi al db

  //selezionio il database

  mysql_select_db(“ddddddd“,$conn_database) or die(“Impossibile selezionare il database.”);ckground: yellow”>//parametro->seleziono il database 

  ckground: yellow”>//url che devo cercare nelle serp, in questo caso รจ un dominio di mia appartenenza

  $stringa_url = “www.xxxxxxxxxxxxxxxxxxx.com“; 

  //Ciclo tra tutte le query presenti nella tabella query_mdr

  $sql_select_query_mdr = “SELECT * from query_mdr”;

  $result_select_query_mdr = mysql_query($sql_select_query_mdr, $conn_database);

  while ($riga1=mysql_fetch_array($result_select_query_mdr, MYSQL_ASSOC)) {

    low”>//trasformo la query prelevata mettendo + al posto degli spazi

    $query_mdr_trasformata = preg_replace( ‘/&{1,1}/’,’%26′, preg_replace  ( ‘/ {1,1}/’  , ‘+’  , $riga1[‘query’]  ) );

    /************ INIZIO ANALISI QUERY  **********/

‘Courier New'”>    $query = $query_mdr_trasformata;

    $pagina_serp = 1;kground: yellow”>// prima pagina

New'”>    $trovato_risultato = 0; //non trovato nella serp

    $data_rilevazione = date(‘YmdHi’);

    /*Controllo l’ultima volta che รจ stata lanciata la query. Devono essere passate almeno 12 ore dallโ€™analisi precedente*/

    $sql_verifica_orario = “SELECT rilevazione from serp where query='”.$query.”‘ order by rilevazione DESC limit 0,1″;

    $result_verifica_orario = mysql_query($sql_verifica_orario, $conn_database);

    $data_ultima_registrata = 0;

    $differenza = 0;

    $rec = 0;

B”>    while ($riga_cat=mysql_fetch_array($result_verifica_orario, MYSQL_ASSOC)) {

      $data_ultima_registrata = $riga_cat[‘rilevazione’];

      $differenza = $data_rilevazione – $data_ultima_registrata;

      $rec++;

    }

    $processare_query = FALSE;

    if ( ($differenza > 1200 ) OR ( $differenza==0 AND $rec==0 ) ){ //12ore

      $processare_query = TRUE;

      echo ‘Posso processare la query<br>’;

    }

    else {

      echo ‘Sono passate MENO di 12 ore. Non processo la query: ‘.$query.'<br>’;

    }

    //A questo punto prelevo da Google i risultati e inizio a scandagliare la SERP.

    for ( $pagina_serp = 1;($pagina_serp < 101) AND ($trovato_risultato == 0) AND $processare_query; $pagina_serp++ ){ // 100 pagine=max 1000 risultati

      //decido lโ€™url della pagina da scaricare a seconda che sia la prima pagina o dalla seconda in poi

      if ( $pagina_serp == 1 ){

ng=”EN-GB”>        $url = “http://www.google.it/search?hl=it&q=”.$query.”&btnG=Cerca+con+Google&meta=”;

      }

      else {

        $str_pagina_url = ($pagina_serp-1)*10;

         New” lang=”EN-GB”>$url = “http://www.google.it/search?hl=it&q=”.$query.”&start=”.$str_pagina_url.”&sa=N”;

      }

      $contenuto_pagina = ”;

      $contenuto_pagina = get_url_contents($url); //scarico la pagina

      $handle = fopen(‘./google.txt’,’w’);//mi salvo la pagina in un file

      fwrite($handle, $contenuto_pagina);

      fclose($handle);

EN-GB”>      $dom = NULL;

      unset($dom);

EN-GB”>      $dom = file_get_dom(‘./google.txt’);

      ow”>// Prelevato il contenuto della pagina. Prelevo i link dalla pagina.

      $i = 0;

      $ci = 0;

      $posizione = 0;//posizione all’interno della pagina

      //questa parte sarebbe meglio metterla in una funzione, in modo tale che se Google cambia il suo codice html basta modificare la funzione, il punto in azzurro serve per selezionare particolari punti dellโ€™albero dom con la libreria simplehtmldom

      foreach($dom->find(‘div.g span.a’) as $node) {

        $posizione ++;

        if ( $trovato_risultato == 0 ) {

          $stringa_trasformata_risultato = $node->innertext;

          $controllo_risultato = strpos( str_replace(‘<b>’,”, str_replace(‘</b>’,”,$stringa_trasformata_risultato) ),$stringa_url);// tolgo <b> </b>

          $stringa_url_ripulita =  str_replace(‘<b>’,”, str_replace(‘</b>’,”,$stringa_trasformata_risultato) );

          if ( $controllo_risultato === FALSE ){

            echo “NON HO TROVATO IL RISULTATO<br>”;

          }

          else { ow”>//ho trovato la URL cercata

            $trovato_risultato = 1;

            $posizione_serp = $posizione + ($pagina_serp-1)*10;

            echo “TROVATO RISULTATO NELLA POSIZIONE: “. $posizione_serp.”<br>”;

          }

        }

      }//chiudo il ciclo foreach

New'”>      $node = NULL;

      unset($node);

      $secondi_attendere = rand(5,10);//aspetto un tempo casuale tra 5 e 10 secondi prima di andare alla prossima pagina della SERP

      sleep  (  $secondi_attendere );

      $dom->clear();

    }//fine ciclo tra le serp della pagina

    if ( $processare_query ){

      if ( $trovato_risultato == 0 ){

        $posizione_serp = 9999;//se non trovo il mio url nelle prime 9999 posizioni metto nel database comunque 9999

      }

    //inserisco nel database il risultato della ricerca

w'”>    $sql_insert_risultato = “INSERT INTO serp(query,rilevazione,posizione,urlserp) VALUES(‘”.$query.”‘,'”.$data_rilevazione.”‘,”.$posizione_serp.”,'”.$stringa_url_ripulita.”‘)”;

    mysql_query($sql_insert_risultato,$conn_database);

  }

  >/************ FINE ANALISI DELLA QUERY IN ESAME  **********/

  $prelevo_time = time();

  $diff = $prelevo_time – $inizio_time;

  if ( $diff > 3300) { //55minuti = 3300 secondi -&gt; Faccio durare lo script non piรน di 55 minuti

    mysql_close($conn_database);

    exit();

  }

  : yellow”>//tra una query e l’altra aspeto dai 60 ai 120 secondi, non posso prelevare troppe pagine da Google

    $secondi_attendere = rand(60,120);

    sleep  (  $secondi_attendere );

  } //Fine ciclo di tutte le query

  mysql_close($conn_database);

?>

Non mi dite che รจ difficile da capire, lโ€™ho commentato tutto perรฒ se ci sono dubbi basta chiedere. Sicuramente lo script รจ migliorabile in molti punti perรฒ il suo sporco lavoro lo fa egregiamente ๐Ÿ™‚

Dopo che lโ€™avete fatto girare per un poโ€™ di giorni non dovete fare altro che scaricare i dati dalla tabella serp e portarveli in un foglio Excel per farvi le vostre analisi. Vi allego uno screenshot di esempio della posizione delle mie query su Google (in ascissa si trova la data della rilevazione e nella ordinata si trova la posizione).

Screenshot di esempio

Questo รจ tutto amici. Se avete dubbi, volete creare qualche attivitร  di business in Internet (siti web, forum,servizi online…) potete contattarmi su matteo.boffo@gmail.com. Ciao!!!

Max Valle

Da oltre 30 anni, offro consulenza e servizi digitali ad aziende e professionisti che desiderano far crescere il proprio business. Attraverso l’acquisizione di nuovi clienti in modo etico ed efficace, e l’utilizzo delle piรน recenti tecnologie web, aiuto i miei clienti a raggiungere i loro obiettivi nel pieno rispetto delle normative vigenti.

  • Certified Professional Ethical Hacker nยฐ4053103 
  • International Web Association nยฐ0312827
  • Membro Federprivacy nยฐFP-9572
  • Associazione Informatici Professionisti nยฐ3241
  • Consulente Tecnico d’Ufficio (CTU)

Oppure chiamami gratuitamente:

Numero Verde Max Valle