14Aug
Questa guida mostra come facilmente dalla riga di comando di Linux analizzare i file di log di Apache per ottenere dati relativi alle query stringa che gli utenti digitano per trovare la vostra pagina web in un motore di ricerca.Ho incluso una ricerca GUI php, nonché per uso facile.
- 1 Usa awk e sed per analizzare i file di log di Apache per utente ha digitato query di ricerca
- 2 Problemi noti
- 3 Versione 2: Meno riga di comando di pre-elaborazione e una maggiore elaborazione php
- 4 ToDo
- 5 Tips & Tricks amp;Avvertenze
- 6 Commenti
Usa awk e sed per analizzare i file di log di Apache per utente ha digitato query di ricerca
Ecco il codice prima per ottenere il lavoro fatto.Si noti che $ title2 dovrebbe essere sostituito da quello che stai cercando, ma gli spazi sono sostituiti con "\ +".
Per esempio: "Come trovare un grande lollypop" sarebbe "Come \ + a \ + trovare \ + a \ + grande \ + lollypop"
Questo è perché ho intenzione di chiamare da una funzione php, dove voglio iopopolare $ Title2, come si vedrà in seguito.Avrei potuto mettere il
egrep tardi, ma poi non si avrà la possibilità di cercare sia il titolo della pagina e le query.La mia versione originale solo cercato di query, ma ho voluto una funzione ho potuto facilmente chiamare per una determinata pagina per vedere tutte le domande che gli utenti hanno digitato nel corso delle ultime settimane. gatto /var/log/virtualmin/VisiHow.com_access_log |i dati #Get dal egrep log di accesso "(q | p) =" |#use Solo i record che probabilmente hanno query di ricerca sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Non alcune modifiche di formattazione e, soprattutto, cambiare tutti gli spazio sottolinea a + egrep -I "$ title2" | #search a $ title2 awk '{print $ 11}' | #extract solo i dati di ricerca sed 's / p = / q = / ig' | #handle Yahoo p = awk -F 'q =' '{print $ 2}' | #grab tutti i dati che iniziano con q = sed 's / q = // g; s / + / / g; s /% 22 / "/ g; s /% 20/ / g; '|#reformat in formato leggibile taglio -d umano "& amp;"-f 1 |#strip fuori altri parametri awk '{print $ 0 "
"}' #add
collegamento si rompe perché stiamo progettando di uscita a una pagina web
== Creiamo un wrapper GUI PHP
HTML per questo ora ==Per fare questo facilmente utilizzo vogliamo accedere ai dati di query utente da un modulo di ricerca pagina web.
queries.php
& lt; title & gt; query degli utenti & lt; / title & gt;& Lt; meta name = contenuto "robot" = "noindex" & gt;
& lt; form name = metodo "sform" = "get" & gt;Cerca Titolo: & lt; ingresso size = valore "80" = "& lt; php echo $ _GET [ 'title']; & gt;?"name = "title" type = "text" & gt;& Lt; valore di input = "Ricerca" type = "submit" & gt;SUGGERIMENTO: È possibile utilizzare un titolo parziale o addirittura regex come & lt; / form & gt; "Samsung * danni."
$ title = $ _GET [ 'title'];$ Title = preg_replace( "/ come / i", "", $ titolo);$ Title2 = str_replace( "", "\ +", $ titolo);$ Title2 = str_replace( "_", "\ +", $ Title2);
$ bigcmd = & lt; & lt; & lt; EOF
egrep -i "(q | p) =" |#use Solo i record che probabilmente hanno query di ricerca sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Non alcune modifiche di formattazione e, soprattutto, cambiare tutti gli spazio sottolinea a + egrep -i "$ title2" | #search per title2 awk '{print $ 11}' | #extract solo i dati di ricerca sed 's / p = / q = / ig' | #handle yahoo p = awk -F'q =' '{print $ 2}' | #grab tutti i dati che iniziano con q = sed 's / q = // g; s / + / / g; s /% 22 / "/ g; s /% 20 // g; '|#reformat in formato leggibile taglio -d umano "& amp;"-f 1 |#strip fuori altri parametri awk '{print $ 0 ""}' #add
collegamento si rompe perché stiamo progettando di uscita a una pagina web
EOF;
se "{print
Ricerca di" $ titolo "..."( $ title = "!)";print "settimana in corso. ..";stampa `/var/log/virtualmin/visihow.com_access_log cat |i dati #Get dal log di accesso $ bigcmd `;// Sosteniamo p = troppo perché Yahoo usa che. .. anatra strano lol for( $ i = 1; $ i & lt; 6; $ i ++){ print "$ i
SETTIMANA( i) fa
";stampare `zcat /var/log/virtualmin/visihow.com_access_log.$i.gz |i dati #Get dal log di accesso $ bigcmd `;}}
& gt;
& lt; / EOF
Problemi noti
Il grep è in ripresa record con i dati di riferimento in modo che sta tornando record indesiderati.Per esempio, se qualcuno cerca "iPhone" e un utente è in una pagina iPhone poi cliccato per andare a una pagina Samsung, questo codice raccoglie l'iPhone dal referrer e, quindi, comprende che i dati che non dovrebbe.Sto lavorando su versione 2, che fa molto di più e sarà risolvere questo bug spostando gran parte della riga di comando di pre-elaborazione in php.Il codice sarà più ottuso, ma darà i dati di gran lunga più utili e precise.
Versione 2: Meno riga di comando di pre-elaborazione e una maggiore elaborazione php
Questa versione presenta i seguenti vantaggi / svantaggi:
- Meno riga di comando di pre-elaborazione significa codice più
- più php significa maggiore controllo e dispone
- ignora richieste multiple duplicati dallo stesso IP
- Conti ricerche multiple invece di elencare loro più volte
- Visualizza trend informazioni visualizzando i totali settimanali
- uscita èin div scorrevoli per una facile visualizzazione di pagine popolari
- Ordinati per lunghezze di query pari, il che significa circa le pagine più popolari mostrano prima
- Un po 'veloce e sporco JavaScript & amp;css per rendere l'auto div espandersi per la visualizzazione dettagliata
& lt; title & gt; Utente Query & lt; / title & gt;& Lt; meta name = contenuto "robot" = "noindex" & gt;
& lt; form name = metodo "sform" = "get" & gt;Cerca Titolo:? & Lt; ingresso size = valore "80" = "& lt; php
if( strlen( $ _ GET [ 'title']) & gt; 0){
echo $ _GET [ 'title'];
} else{
echo "*"; & lt; br = "" type = "text" & gt;} & gt;? "name = "titolo" / & gt;& Lt; valore di input = "Ricerca" type = "submit" & gt;
SUGGERIMENTO: Inserire * per vedere tutto.È possibile utilizzare un titolo parziale o addirittura regex come "Samsung * danni." & Lt; / form & gt;
sortbylen( $ a, $ b){
ritorno strlen( $ b) -strlen( $ a);}
$ title = $ _GET [ 'title'];$ Title = preg_replace( "/ come / i", "", $ titolo);$ Title2 = str_replace( "", "\ +", $ titolo);$ Title2 = str_replace( "_", "\ +", $ Title2);
$ bigcmd = & lt; & lt; & lt; EOF
egrep -i "(q | p) =" |#use Solo i record che probabilmente hanno query di ricerca sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Non alcune modifiche di formattazione e, soprattutto, cambiare tutti gli spazio sottolinea a + awk '{print $ 1 "" $ 7 "" $ 11}' | egrep -i "$ title2" #search per title2EOF;
if( $ title = ""){ print
"Ricerca di" $ titolo "..."; for( $ i = 0; $ i & lt; 6; $ i ++){ if( $ i == 0){ $ searchlogdata = `cat /var/log/virtualmin/visihow.com_access_log | $ bigcmd`;} else{ $ searchlogdata =` zcat /var/log/virtualmin/visihow.com_access_log.$i.gz | $ bigcmd`;} $ searchlogarray = explode( "\ n", $ searchlogdata); foreach( $ searchlogarray da $ sdata){ $ logparts = explode( "", $ sdata); $ ip = $ logparts [0]; $ url = $ logparts[1]; preg_match( "/( q | p) =( *).?"( \ & amp; |? $) / ", $ logparts [2], $ partite);$ Ss = urldecode( $ partite [2]);$ Ss = str_replace( "+", "", $ ss);if( (strlen( trim( $ ss)) & gt; 3) & amp; & amp;( preg_match( "# http \: \ / \ / # i", $ ss))){ // tenere fuori URL dalle ricerche del sitoif( ($ ip = $ labbro) ||( $ ss = $ LSS)!!){ $ labbro = $ ip;$ LSS = $ ss;$ Ssdata [ "$ url"] = "$ ss |.";}}} Uasort( $ array, 'sortbylen');foreach( $ ssdata da $ key = & gt; $ value){ $ Sarr = explode( "|", $ value);foreach( $ Sarr da $ s){ if( strlen( $ s) & gt; 0) $ s2 [$ s] ++;} Arsort( $ s2);foreach( $ s2 da $ key2 = & gt; $ val2){ $ URLData [tasto $] [$ i] = "$ val2: $ key2";.$ Stot [tasto $] [$ i] + = $ val2;} Unset( $ s2);} Unset( $ ssdata);} Foreach( $ URLData da $ url = & gt; $ weekdata){ print " & lt; a target =" _ blank "href =" $ url "& gt; $ url & lt; / a & gt;
";$ Wk = 0;... Foreach( $ weekdata da $ settimana){ print "
" $ wk ++ "SETTIMANA( i) fa: Totale Ricerche =" $ stot [$ url] [$ wk-1] "
";.print "& lt; div onmouseover =" this.style.height = 500 "onmouseout =" this.style.height = 100 "& lt; br =" "& gt; & lt; / div & gt; style = 'width: 800px; height: 100px; border: 1px solid grigio; overflow: scroll '& gt; $ settimana ";}}}
& gt;
& lt; / EOF
ToDo
Ordina per lunghezza query come ordinamento secondario, con le query più lunghe
primo
Questo è tutto.Mi piacerebbe sentire le vostre esperienze con questo codice o proposte di miglioramento.Tips & Tricks amp;Avvertenze
- Nota: Sono a favore p = come bene e la q di serie = perché Yahoo essendo l'anatra dispari è usa p =
- versione 2 PHP è più complessa e mi è stato codifica veloce, quindi alcune delle variabiliI nomi sono stati selezionati male.Si prega di non si lamentano come il suo codice libero.Ma se si vuole risolvere il problema e documentare e aggiungerlo nella wiki come versione 3 che sarebbe fantastico:) Pay It Forward!
- In caso di problemi con uno di questi passaggi, fare una domanda per ulteriori informazioni, oppure inserire nella sezione commenti qui sotto.
Commenti
| Daniel in Primo Piano 69 articoli introduttiva 2.601 Articolo modifiche 24.290 Punti |
Daniel è un autore descritto con VisiHow.Daniel ha raggiunto il livello di "tenente", con 24.290 punti.Daniel ha iniziato a 69 articoli e fatto 2.601 modifiche articolo.17,578 persone hanno letto i contributi articolo di Daniel. |
Daniel : | Ciao, il mio nome è Daniel. |
Daniel : | posso aiutarti con il tuo problema di "Facilmente analizzare / cercare stringhe di query di ricerca di una pagina web dal log di Apache con PHP awk e sed utility a riga di comando di Linux"? |