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:
Vediamo innanzitutto le tabelle contenute nel database (colore giallo nello schema)
Nel database ci sono due tabelle:
- query_mdr che contiene un unico campo (query) che contiene tutte le query che vogliamo analizzare
- 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:
query | rilevazione | posizione | urlserp |
abiti+eleganti+premaman | 200806060052 | 9 | www….. |
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)
<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 -> 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).
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!!!