Resultados de busca do Google no seu site

Hoje estava eu aqui, sem nada pra fazer, e resolvi mostrar pra vocês como é fácil usar a API de buscas do Google (Google Search API).

Fiz uma classe que vocês vão poder usar para pegar o resultado de busca do Google e exibir no seu site, na formatação que preferir.

A Classe – Versão 1.1

<?php

/**
 * API de busca do Google
 *
 * @author			Thiago Belem (contato@thiagobelem.net)
 * @link			http://blog.thiagobelem.net/
 * @version			1.1
 */
class googleSearchAPI {
	protected $url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&rsz=large&start=%s&q=%s';
	var $resultado, $pagina, $keywords;

	function __construct() {
		if (!function_exists('curl_init')) {
			trigger_error('A biblioteca cURL não está instalada!');
			return false;
		}
		if (!function_exists('json_decode')) {
			trigger_error('A biblioteca para manipulação de JSON não está instalada!');
			return false;
		}
	}

	/**
	 * Pega o resultado HTTP de uma URL
	 */
	protected function httpRequest($url) {
		$cURL = curl_init($url);
		curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($cURL, CURLOPT_FOLLOWLOCATION, true);
		$resultado = curl_exec($cURL);
		$resposta = curl_getinfo($cURL, CURLINFO_HTTP_CODE);
		curl_close($cURL);
		return $resultado;
	}

	/**
	 * Executa a busca
	 */
	function busca($keywords = null, $pagina = 1, $site = null) {
		$keywords = (is_null($keywords)) ? $this->keywords : $keywords;
		$start = (is_null($pagina)) ? 0 : (($pagina - 1) * 8);

		$bkeywords = (!is_null($site)) ? ($keywords . ' site:' . $site) : $keywords;

		$url = sprintf($this->url, (int)$start, urlencode($bkeywords));
		$resultado = $this->httpRequest($url);
		if (!$resultado) {
			trigger_error('Não foi possível acessar a URL de busca:<br />' . $url);
			return false;
		}
		$resultado = json_decode($resultado, true);

		$this->resultado = $resultado['responseData'];
		$this->keywords = $keywords;
		$this->pagina = $pagina;
	}

	/**
	 * Pega os resultados encontrados
	 */
	function resultadoSites() {
		return $this->resultado['results'];
	}

	/**
	 * Pega o total de sites encontrados
	 */
	function resultadoTotal() {
		return $this->resultado['cursor']['estimatedResultCount'];
	}
}

?>

Exemplo de Uso

<?php

$keywords = 'Thiago Belem';
$pagina = (isset($_GET['p'])) ? (int)$_GET['p'] : 1;

$gs = new googleSearchAPI();
//$gs->busca($keywords, $pagina); // Busca normal
$gs->busca($keywords, $pagina, 'thiagobelem.net'); // Busca em um site específico

$total = $gs->resultadoTotal();

echo "Total estimado de resultados: " . $total;
echo "<br />";
echo "<h2>Pagina: " . $gs->pagina . "</h2>";

foreach ($gs->resultadoSites() as $item) {
	echo "<h3>" . $item['title'] . "</h3>";
	echo "<p>" . $item['content'] . "</p>";
	echo '<a href="' . $item['unescapedUrl'] . '">' . $item['visibleUrl'] . "</a>";
}

echo "<hr />";

// Paginadores:

if (($pagina - 5) > 1) echo '...&nbsp;';

for ($n = 1; $n <= ceil($total / 8); $n++) {
	if (($n < ($pagina - 5)) OR ($n > ($pagina + 5))) continue;
	echo '<a href="?q='.$keywords.'&p='.$n.'">'.$n.'</a>&nbsp;';
}

if (($pagina + 5) < $total) echo '...';

?>

Infelizmente essa API de busca do Google só retorna 8 resultados por vez (uma limitação do Google mesmo)… mas você tem acesso a todas as páginas que precisar.. É só mudar o valor da variável $pagina (do exemplo).

[15.07.09] Atualização: Atualizei pra v1.1: Busca em um site específico

Espero que tenham gostado! ;)

23 ideias sobre “Resultados de busca do Google no seu site

  1. Juca

    Fala ae Thiago, beleza?

    Aqui funcionou tudo direitinho, só que quando busco uma palavra que não tenho(proposital para simular o que o usuário pode fazer) ele me acusa erro de não definido.

    Notice: Undefined index: estimatedResultCount in C:\xampp\htdocs\meusite\classes\class.busca.google.php on line 62
    

    linha 62 tem esse código

    # class.busca.google.php
    return $this->resultado['cursor']['estimatedResultCount'];
    

    Pode me dar uma força para sanar isso, sem ter que esconder os alertas do PHP pois sempre uso esse cara nos meus sites/sistemas.

    	# function.varias.php
    	# Visualizar Erros PHP (Debug Mode)
    	# 0 Desligado, 1 Ligado
    	$debug = 1;
    	if($debug){
    		ini_set('display_errors', 1);
    		ini_set('error_reporting', E_ALL);
    		ini_set('log_errors', 1);
    		ini_set('error_log', dirname(__FILE__) . '../log_erros.txt');
    	} else {
    		ini_set('display_errors', 0);
    	}
    

    Valeu brother, seus tutoriais e artigos são os melhores, forte abraço.

  2. cpmrss

    opa, pois é cara.. estou usando o 'lr' mas mesmo assim os resultados não batem. o estranho é ver ferramentas como a rank tracker da mestre seo que utiliza o api e consegue trazer resultados fiéis.

  3. cpmrss

    Fala Thiago. cara eu uso esse argumento hl=pt_BR, mas se tu for comparar os resultados que retornam com API e os resultados da busca normal vais ver q não batem 100% parece as vezes que os resultados do api estão desatualizados.

    já revirei a documentação e não achei nada que me de mais especificações de argumentos.

    http://code.google.com/intl/pt-BR/apis/ajaxsear

    não sabes de algo que eu faça para receber os resultados do api mais parecidos com os da busca normal? Abraço!

  4. Thiago Belem

    Não há servidores do Google espalhados pelo mundo. O que há é uma opção de
    idioma na hora de busca… Faça uma busca no Google e você verá o parâmetro
    “hl” na URL. :)

  5. cpmrss

    nesse caso é feita uma busca no servidor do google que estiver mais perto do servidor da hospedagem né?

    no caso se eu usar uma hospedagem fora do brasil, quase certo que os resultadados nao vao coencidir muito nas posições. você sabe se da pra fazer requesição pra essa url do api do google com proxy? pra usar o ip do usuario que fizer a busca e coencidir os resultados com os do brasil?

  6. alex

    ola esta dnod um problema na 9º pagina :

    Warning: Invalid argument supplied for foreach() in F:SITESwwwbuscadorindex.php on line 52

    estive vendo mais não entendi o problema ainda.

  7. Hiei

    Reparei que esse sistema não ta trazendo os mesmos resultados do Google.
    O que devo fazer para trazer o mesmo resultado?
    Quero unir vários buscadores!

  8. Phelipp de Avila

    Olá Thiago,

    Se puder dar uma força na configuração da restrição da pesquisa em apenas um site pre-configurado.

    tentei de tudo aqui mas nada….

    Grande abraço…

  9. Phelipp de Avila

    Resolvi essa parte já… Obrigado!

    No fim do código você disse que não tem condições de aumentar os registros, que o máximo é 4, mas disse que tem como navegar entre as páginas.

    Eu criei a navegação de links tipo <>
    funciona perfeitamente, utilizei o número que vem do $gs->resultadoTotal(); dividi por 4 dentro do ceil() para dar numero inteiro e com base nisso criei a paginação.

    O problema é que quando passo para a segunda página ele muda esse número. Tipo se pesquisei pela palavra ‘teste’ e deu 23 resultados encontrados, quando passo para a segunda página esse número muda pra 5.

    Muito estranho! peço desculpas pelas amolações, mas é que preciso muito dessa classe.

    Agradeço desde já..! Até mais..

    Se puder me adicionar no msn ae.. eu uso o YahooMessenger do Webmail
    é só adicionar lá.

    Valew..

  10. Phelipp de Avila

    Desculpe a quantidade de comentários…. mas esqueci de falar:

    tentei fazer isso aqui pra usar mais palavras:

    $keywords = ‘Phelipp+de+avila';

    $keywords = explode(“+”, $keywords);

    Mas dá esse erro:

    Warning: urlencode() expects parameter 1 to be string, array given in /home/****/public_html/busca.class.php on line 32

    Obrigado…

    1. Thiago Belem

      @Phelipp
      Se você mudar a forma que a classe trabalha você vai precisar mudar em outros lugares também, não só no explode… Eu testei a classe com mais de uma palavra e funcionou normalmente… Verifica se não é algo que vc tá fazendo errado. ;)

  11. Phelipp de Avila

    Thiago… consegui colocar pra funcionar…

    mas quando busco por mais de uma palavra não funciona.
    o que eu posso fazer para resolver isso?

    Obrigado desde já e até mais…

  12. Phelipp de Avila

    Olá Thiago!

    Adicionei no meu sistema a classe e me aparece o seguinte erro:

    Fatal error: Class ‘googleSearchAPI’ not found in /home/*****/public_html/index.php on line 769

    Porém adicionei a classe sim… tanto é que local ela não funciona e me o erro:

    Notice: A biblioteca cURL não está instalada! in C:xampphtdocs..busca.class.php on line 11

    Fatal error: Call to undefined function curl_init() in C:xampphtdocs..busca.class.ph on line 19

    Fico no aguardo de uma ajuda sua…

    Você conheçe alguma técnica ou algum sistema de busca “pronto” que faça a busca através dos textos das páginas tipo do google pra colocar internamente no site.

    Grande abraço, até mais.. Você está de parabéns, o site tá ótimo!

    1. Thiago Belem

      @Phelipp
      1 – Você incluiu o arquivo com a classe antes de tentar usá-lo pra uma busca?
      2 – Sobre o “biblioteca não instalada” você precisa instalar o cURL pra isso tudo funcionar.

  13. fschuindt

    Nossa, muito bacana isso XD
    Cara, outra coisa que eu gostei foi desse seu plugin de códigos do WP, pra fazer highlight… Pode me dizer se ele é plugin mesmo ou se já é do theme?
    Se ele for plugin, tem como configurar as cores?

    Valeu!

Os comentários estão fechados.