14Aug
este Como le mostrará cómo fácilmente en la línea de comandos de Linux analizar los archivos de registro de Apache para obtener una cadena de búsqueda de datos de consulta que los usuarios escriben para encontrar su página web en un motor de búsqueda.He incluido una interfaz gráfica de usuario de búsqueda php, así como para el uso fácil.
- 1 Uso awk y sed para analizar los archivos de registro de Apache para la búsqueda mecanografiado usuario consulta
- 2 Problemas conocidos
- 3 Versión 2: Menos de preprocesamiento línea de comandos y más procesamiento php
- 4 trucos Tareas Tips
- 5 & amp;Advertencias
- 6 Comentarios
Uso awk y sed que analizar los archivos de registro de Apache para la búsqueda mecanografiado usuario consulta
Aquí está el código prima para hacer el trabajo.Tenga en cuenta que $ title2 se debe reemplazar por lo que está buscando, pero los espacios son reemplazados con "\ +".
Por ejemplo: "¿Cómo encontrar un gran caramelo con palo" sería "¿Cómo \ + a \ + encontrar \ + a \ + grande \ + caramelo con palo"
Esto se debe a que tengo la intención de llamar a partir de una función php, en el que sepoblar $ title2 como se verá más adelante.Podría haber puesto el
egrep más tarde, pero entonces no tendrá la opción de buscar tanto título de la página y consultas.Mi versión original acaba de consultas buscó, pero yo quería una función que fácilmente podría llamar a una página determinada y ver todas las consultas que los usuarios han escritos a través de las últimas semanas. gato /var/log/virtualmin/VisiHow.com_access_log |#GET datos del registro de acceso egrep "(q | p) =" |#Utilice Sólo los registros que tienen probabilidades consultas de búsqueda sed '22 /' / G s /%; s /% 20 / + / g; s / _ / + / g; '| #No algunos cambios de formato y lo más importante cambiar todos los espacioso subraya a + egrep -i "$ title2" | #search por $ title2 awk '{print $ 11}' | #extract sólo los datos de búsqueda sed 's / p = / = q / ig' | #handle Yahoo p = awk -F '= q' '{print $ 2}' | #grab todos los datos que comienzan con q = sed 's / q = // g; s / + / / g; s /% 22 / "/ g; s / 20%/ / g; '|#reformat a humano formato legible corte -d "& amp;"-f 1 |#strip de otros parámetros awk '{print $ 0 "
"}' #ADD
enlace se rompe porque estamos pensando en la salida a una página web
== Vamos a crear una envoltura GUI PHP
HTML para esto ahora ==Para hacer esto fácilmente el uso que queremos acceder a los datos de la consulta de usuario desde un formulario de búsqueda página web.
queries.php
& lt; title & gt; Consultas de usuarios & lt; / title & gt;& Lt; meta name = contenido de "robots" = "noindex" & gt;
& lt; form name = método de "sform" = "get" & gt;Buscar Título: & lt; = valor de entrada de tamaño "80" = "& lt;? Php echo $ _GET [ 'titulo']; & gt;?"name = "título" type = "text" & gt;& Lt; valor de entrada = "Buscar" type = "submit" & gt;SUGERENCIA: Puede utilizar un título parcial o incluso regex como & lt; / form & gt; "Samsung * daños."
$ titulo = $ _GET [ 'titulo'];$ Title = preg_replace( "/ cómo / i", "", $ titulo);$ Title2 = str_replace( "", "\ +", $ titulo);$ Title2 = str_replace( "_", "\ +", $ title2);
$ bigcmd = & lt; & lt; & lt; EF
egrep -i "(q | p) =" |#Utilice Sólo los registros que tienen probabilidades consultas de búsqueda sed '22 /' / G s /%; s /% 20 / + / g; s / _ / + / g; '| #No algunos cambios de formato y lo más importante cambiar todos los espacioso subraya a + egrep -i "$ title2" | #search de awk title2 '{print $ 11}' | #extract sólo los datos de búsqueda sed 's / p = / = q / ig' | #handle yahoo p = awk -F'q =' '{print $ 2}' | #grab todos los datos que comienzan con q = sed 's / q = // g; s / + / / g; s /% 22 / "/ g; s /% 20 // g; '|#reformat a humano formato legible corte -d "& amp;"-f 1 |#strip de otros parámetros awk '{print $ 0 ""}' #ADD
enlace se rompe debido a que estamos planeando para dar salida a una página web
EOF;
si "{print
La búsqueda de" $ título de "..."( $ title = "!)";print "semana en curso. ..";impresión `/var/log/virtualmin/visihow.com_access_log gato |#GET de datos del registro de acceso $ bigcmd `;// Apoyamos p = yahoo también porque utiliza ese bicho raro. .. lol for( $ i = 1; $ i & lt; 6; $ i ++){ print "
$ i SEMANA( S) hace
";imprimir `/var/log/virtualmin/visihow.com_access_log.$i.gz zcat |#GET de datos del registro de acceso $ bigcmd `;}}
& gt?;
& lt; / EF
Problemas conocidos
El grep es recoger registros con datos referenciales por lo que está regresando registros no deseados.Por ejemplo, si un usuario busca "iPhone" y era un usuario en una página de iPhone a continuación, hace clic para ir a una página de Samsung, este código recoge el iPhone de la de referencia y por lo tanto incluye que los datos que no debería.Estoy trabajando en la versión 2, que hace mucho más y va a corregir este error moviendo gran parte de la línea de comandos pre-procesamiento en php.El código será más obtuso, pero le dará los datos mucho más útiles y precisos.
Versión 2: Menos de preprocesamiento línea de comandos y más procesamiento php
Esta versión tiene las siguientes ventajas / desventajas:
- Menos línea de comandos pre-procesamiento significa que el código ya
- más php significa más control y cuenta con
- Ignora múltiples peticiones duplicadas de la misma ip
- Counts múltiples búsquedas en lugar de enumerarlos varias veces
- Mostrar información de tendencias mediante la visualización de los datos semanales
- salida seen divs desplazables para facilitar la visualización de las páginas más populares para
- Ordenado por longitudes de consulta totalizaron, que aproximadamente significa que las páginas más populares demuestran primera
- Un poco rápido y sucio javascript & amp;CSS para hacer el auto divs para ampliar la visualización detallada
& lt; title & gt; preguntas del usuario & lt; / title & gt;& Lt; meta name = contenido de "robots" = "noindex" & gt;
& lt; form name = método de "sform" = "get" & gt;Buscar Título: & lt; entrada size = valor "80" = "& lt; php
si( strlen( $ _ GET [ 'titulo']) & gt; 0){
echo $ _GET [ 'titulo'];
} else{
echo "*"; & lt; br = "" type = "text" & gt;} & gt;? "name = "título" / & gt;& Lt; valor de entrada = "Buscar" type = "submit" & gt;
PISTA: Introduzca * para ver todo.Se puede utilizar un título parcial o incluso regex como "Samsung * daños." & Lt; / form & gt;
sortbylen( $ a, $ b){ strlen
retorno( $ b) -strlen( $ a);}
$ titulo = $ _GET [ 'titulo'];$ Title = preg_replace( "/ cómo / i", "", $ titulo);$ Title2 = str_replace( "", "\ +", $ titulo);$ Title2 = str_replace( "_", "\ +", $ title2);
$ bigcmd = & lt; & lt; & lt; EF
egrep -i "(q | p) =" |#Utilice Sólo los registros que tienen probabilidades consultas de búsqueda sed '22 /' / G s /%; s /% 20 / + / g; s / _ / + / g; '| #No algunos cambios de formato y lo más importante cambiar todos los espacioso subraya a + awk '{print $ 1 "" $ 7 "" $ 11}' | egrep -i "$ title2" #search para title2EOF;
if( $ title = "!"){ print
"La búsqueda de" $ título de "..."; for( $ i = 0; $ i & lt; 6; $ i ++){ if( $ i == 0){ $ searchlogdata = `/var/log/virtualmin/visihow.com_access_log gato | $ bigcmd`;} else{ $ searchlogdata =` zcat /var/log/virtualmin/visihow.com_access_log.$i.gz | $ bigcmd`;} $ searchlogarray = explode( "\ n", $ searchlogdata); foreach( $ searchlogarray como $ sdata){ $ logparts = explotan( "", $ sdata); $ ip = $ logparts [0]; $ url = $ logparts[1]; preg_match( "/( q | p) =( *).?"( \ & amp; |? $) / ", $ logparts [2], $ partidos);$ Ss = urldecode( $ coincidencias [2]);$ Ss = str_replace( "+", "", $ ss);if( (strlen( trim( $ ss)) & gt; 3) & amp; & amp;( preg_match( "# http \: \ / \ / # i", $ ss))){ // mantener fuera url de búsqueda de sitiosif( ($ ip = $ labio) ||( ss = $ $ LSS)!!){ $ labio = $ ip;$ LSS = $ ss;$ Ssdata [ "$ url"] = "$ ss |.";}}} Uasort( $ matriz, 'sortbylen');foreach( $ ssdata como $ clave = & gt; $ valor){ $ sarr = explode( "|", $ value);foreach( $ sarr como $ s){ if( strlen( $ s) & gt; 0) $ s2 [$ s] ++;} Arsort( $ s2);foreach( $ s2 como $ clave2 = & gt; $ val2){ $ urldata [$ key] [$ i] = "$ val2: $ clave2";.$ Stot [$ key] [$ i] + = $ val2;} Unset( $ s2);} Unset( $ ssdata);} Foreach( $ urldata como $ url = & gt; $ weekdata){ print " & lt; a target =" _ blank "href =" $ url "& gt; $ url & lt; / a & gt;
";$ Sem = 0;... Foreach( $ weekdata como $ semana){ print "
" $ sem ++ "SEMANA( S) AGO: Total de búsquedas =" $ stot [$ url] [$ sem-1] "
";.print "& lt; div onmouseover =" this.style.height = 500 "onmouseout =" this.style.height = 100 "& lt; br =" "& gt; & lt; / div & gt; style = 'width: 800px; altura: 100px; border: 1px solid gris; overflow: scroll '& gt; $ semana ";}}}
& gt?;
& lt; / EF
Tareas
Ordenar por longitud de la consulta como una especie secundaria, con consultas más largas
primera
Eso es todo.Me encantaría escuchar sus experiencias con este código o sugerencias de mejora.Consejos Trucos & amp;Advertencias
- Nota: Apoyo p =, así y el estándar q = porque Yahoo ser el bicho raro que es utiliza p =
- Versión 2 php es más complejo y que se codifica rápido por lo que algunas de las variablesnombres fueron seleccionados mal.Por favor, no se quejan como su código libre.Pero si quieres repararla y volver a documentarlo y añadirlo en el wiki como la versión 3 que sería fantástico:) pagar adelante!
- Si tiene problemas con cualquiera de estos pasos, hacer una pregunta para obtener más ayuda, o publicar en la sección de comentarios.
Comentarios
| Daniel Autor presentado 69 artículos Comienza 2.601 Artículo ediciones 24.290 Puntos |
Daniel es autor ofrecido con VisiHow.Daniel ha alcanzado el nivel de "teniente" con 24.290 puntos.Daniel ha comenzado 69 artículos y realizado 2.601 ediciones del artículo.17.578 personas han leído las contribuciones de artículos de Daniel. |
Daniel : | Hola, mi nombre es Daniel. |
Daniel : | ¿Puedo ayudarle con su problema sobre "Fácilmente analizar / buscar cadenas de consulta de búsqueda de una página web a partir de los registros de Apache usando awk php y utilidades de línea de comandos de Linux sed"? |