14Aug
Este guia irá mostrar-lhe como facilmente na linha de comando Linux analisar os arquivos de log do Apache para obter os dados de consulta de pesquisa seqüência de caracteres que os usuários digitam para encontrar sua página em um motor de busca.Eu incluí um GUI pesquisa php, bem como para o uso fácil.
- 1 Use awk e sed para analisar arquivos de log do Apache para digitado usuário consultas de pesquisa
- 2 Conhecido Problemas
- 3 Versão 2: Menos de pré-processamento linha de comando e mais processamento php
- 4 ToDo
- 5 Dicas Truques & amp;Avisos
- 6 Comentários
Use awk e sed para analisar arquivos de log do Apache para digitado usuário consultas de pesquisa
Aqui está o código-prima para fazer o trabalho.Note que $ title2 deve ser substituir por aquilo que você está procurando, mas os espaços são substituídos por "\ +".
Por exemplo: "Como encontrar um grande lollypop" seria "Como \ + a \ + encontrar \ + a \ + big \ + lollypop"
Isso é porque eu pretendo chamar de uma função php, onde eu voupreencher $ title2 como você verá mais tarde.Eu poderia ter colocado o
egrep mais tarde, mas, em seguida, você não terá a opção de buscar tanto o título da página e consultas.Minha versão original apenas procurou consultas, mas eu queria uma função que eu poderia facilmente chamar para uma determinada página e veja todas as consultas que os usuários se digitados ao longo das últimas semanas. gato /var/log/virtualmin/VisiHow.com_access_log |dados #get do egrep log de acesso "(q | p) =" |#use Apenas registros que provavelmente têm consultas de pesquisa sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Do algumas alterações de formatação e, mais importante mudar todos os espaçosou sublinha a + egrep -I "$ title2" | #search por US $ title2 awk '{print $ 11}' | #extract apenas dados de pesquisa sed 's / p = / q = / ig' | #handle Yahoo p = awk -F 'q =' '{print $ 2}' | #grab todos os dados começando com q = sed 's / q = // g; s / + / / g; s /% 22 / "/ g; s /% 20/ / g; '|#reformat para o formato legível cut -d humana "& amp;"-f 1 |#strip off outros parâmetros awk '{print $ 0 "
"}' #add
quebras de ligação, porque estamos planejando a saída para uma página web
== Vamos criar um invólucro GUI PHP
HTML para este agora ==Para fazer isso facilmente uso queremos acessar os dados da consulta do usuário a partir de um formulário de pesquisa página web.
queries.php
& lt; title & gt; Consultas do usuário & lt; / title & gt;& Lt; meta name = "robots" content = "noindex" & gt;
& lt; form name = "método sform" = "get" & gt;Pesquisa Título: & lt; size = valor de entrada "80" = "& lt; php echo $ _GET [ 'title']; & gt;?"name = "title" type = "text" & gt;& Lt; valor de entrada = "Pesquisar" type = "submit" & gt;DICA: Você pode usar um título parcial ou mesmo regex como & lt; / form & gt; "Samsung * danos."
$ title = $ _GET [ 'title'];$ Title = preg_replace( "/ como / i", "", $ title);$ Title2 = str_replace( "", "\ +", $ title);$ Title2 = str_replace( "_", "\ +", $ title2);
$ bigcmd = & lt; & lt; & lt; eof
egrep -i "(q | p) =" |#use Apenas registros que provavelmente têm consultas de pesquisa sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Do algumas alterações de formatação e, mais importante mudar todos os espaçosou sublinha a + egrep -i "$ title2" | #search para awk title2 '{print $ 11}' | #extract apenas dados de pesquisa sed 's / p = / q = / ig' | #handle yahoo p = awk -F'q =' '{print $ 2}' | #grab todos os dados começando com q = sed 's / q = // g; s / + / / g; s /% 22 / "/ g; s /% 20 // g; '|#reformat para o formato legível cut -d humana "& amp;"-f 1 |#strip off outros parâmetros awk '{print $ 0 ""}' #add
quebras de ligação, porque estamos planejando a saída para uma página web
EOF;
se "{print
Procurando por" $ title "..."( $ title = "!)";print "semana em curso. ..";print `/var/log/virtualmin/visihow.com_access_log gato |dados #get do log de acesso $ bigcmd `;// Apoiamos p = também porque yahoo usa esse. .. pato estranho lol for( $ i = 1; $ i & lt; 6; $ i ++){ print "
$ i semana( s) atrás
";imprimir `/var/log/virtualmin/visihow.com_access_log.$i.gz zcat |dados #get do log de acesso $ bigcmd `;}}
& gt;
& lt; / eof
Conhecido Problemas
O grep é pegar os registros com os dados de referência para que ele está retornando registros indesejados.Por exemplo, se alguém procura por "iPhone" e um usuário estava em uma página de iPhone em seguida, clicar para ir para uma página da Samsung, este código pega o iPhone a partir do referencial e, portanto, inclui que os dados que não deveria.Eu estou trabalhando em versão 2, que faz muito mais e vai corrigir este erro ao mover grande parte da pré-processamento linha de comando em PHP.O código será mais obtuso, mas vai dar dados muito mais úteis e precisas.
Versão 2: Menos de pré-processamento linha de comando e mais processamento php
Esta versão tem as seguintes vantagens / desvantagens:
- Menos de linha de comando de pré-processamento significa mais código
- mais php significa mais controle e apresenta
- ignora várias solicitações duplicadas do mesmo ip
- Counts várias pesquisas em vez de listá-los várias vezes
- apresentar uma tendência informações exibindo totais semanais
- saída éem divs de rolagem para facilitar a visualização de páginas populares
- Ordenado segundo comprimentos de consulta totalizaram, quais aproximadamente significa que as páginas mais populares mostrar primeira
- Um pouco rápido e sujo javascript & amp;css para fazer a auto divs expandir para detalhado visualização
& lt; title & gt; usuário consulta & lt; / title & gt;& Lt; meta name = "robots" content = "noindex" & gt;
& lt; form name = "método sform" = "get" & gt;Pesquisa Título: & lt; size = valor de entrada "80" = "& lt; php
if( strlen( $ _ GET [ 'title']) & gt; 0){
echo $ _GET [ 'title'];
} else{
echo "*"; & lt; br = "" type = "text" & gt;} & gt;? "name = "title" / & gt;& Lt; valor de entrada = "Pesquisar" type = "submit" & gt;
DICA: Digite * para ver tudo.Você pode usar um título parcial ou mesmo regex como "Samsung * danos". & Lt; / form & gt;
sortbylen( $ a, $ b){
strlen retorno( $ b) -strlen( $ a);}
$ title = $ _GET [ 'title'];$ Title = preg_replace( "/ como / i", "", $ title);$ Title2 = str_replace( "", "\ +", $ title);$ Title2 = str_replace( "_", "\ +", $ title2);
$ bigcmd = & lt; & lt; & lt; eof
egrep -i "(q | p) =" |#use Apenas registros que provavelmente têm consultas de pesquisa sed 's /% 22 / "/ g; s /% 20 / + / g; s / _ / + / g;' | #Do algumas alterações de formatação e, mais importante mudar todos os espaçosou sublinha a + awk '{print $ 1 "" $ 7 "" $ 11}' | egrep -i "$ title2" #search para title2EOF;
if( $ title = "!"){ print
"Procurar" $ título "..."; 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 quanto $ sdata){ $ logparts = explode( "", $ sdata); $ ip = $ logparts [0]; $ url = $ logparts[1]; preg_match( "/( q | p) =( *).?"( \ & amp; |? $) / ", $ logparts [2], $ corresponde);$ Ss = urldecode( $ matches [2]);$ Ss = str_replace( "+", "", $ ss);if( (strlen( trim( $ ss)) & gt; 3) & amp; & amp;( preg_match( "# http \: \ / \ / # i", $ ss))!){ // manter fora url a partir de pesquisas do siteif( ($ ip = $ lábio) ||( $ ss = $ LSS)!){ $ lábio = $ ip;$ LSS = $ ss;$ Ssdata [ "$ url"] = "$ ss |.";}}} Uasort( $ array, 'sortbylen');foreach( $ ssdata quanto $ key = & gt; $ value){ $ sarr = explode( "|", $ value);foreach( $ sarr como s $){ if( strlen( $ s) & gt; 0) $ s2 [$ s] ++;} Arsort( $ s2);foreach( $ s2 quanto $ key2 = & gt; $ val2){ $ urldata [$ key] [$ i] = "$ val2: $ key2";.$ Stot [$ key] [$ i] + = $ val2;} Unset( $ s2);} Unset( $ ssdata);} Foreach( $ urldata quanto $ url = & gt; $ weekdata){ print " & lt; a target =" _ blank "href =" $ url "& gt; $ url & lt; / a & gt;
";$ Wk = 0;... Foreach( $ weekdata quanto $ semana){ print "
" $ semana ++ "SEMANA( s) atrás: Total de Pesquisas =" $ 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 cinza; overflow: rolar '& gt; $ semana ";}}}
& gt;
& lt; / eof
ToDo
Ordenar por tamanho da consulta como um tipo secundário, com consultas mais longas
primeira
É isso.Gostaria muito de ouvir suas experiências com este código ou sugestões de melhoria.Dicas Truques & amp;Avisos
- Nota: Eu apoio p = bem eo q padrão = porque o Yahoo sendo o pato é estranho utiliza p =
- Version 2 php é mais complexo e eu estava de codificação rápido para algumas das variáveisnomes foram selecionados mal.por favor não reclamar como seu código livre.Mas se você quer consertá-la e documentá-lo e adicioná-lo na wiki como a versão 3, que seria fantástico:) Pay It Forward!
- Se você tiver problemas com qualquer uma dessas etapas, fazer uma pergunta para obter mais ajuda, ou postar na seção de comentários abaixo.
Comentários
| Daniel Autor Destaque 69 artigos Iniciado 2.601 artigo edições 24,290 Pontos |
Daniel é um autor caracterizado com VisiHow.Daniel alcançou o nível de "tenente", com 24,290 pontos.Daniel começou 69 artigos e fez 2.601 artigo edições.17.578 pessoas leram contribuições artigo de Daniel. |
Daniel : | Oi, meu nome é Daniel. |
Daniel : | Posso ajudá-lo com o seu problema sobre "Facilmente analisar / search cordas de consulta de pesquisa de uma página Web a partir apache logs usando awk php e utilitários de linha de comando do Linux sed"? |