Publicidade (Anuncie Aqui)

Resultados de busca do Google no seu site

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! ;)

Você também vai gostar de ler:

Postado em Artigos, PHP, Tutoriais

Com as tags , , , , , , , , , , , , , , , ,

Escrito por Thiago Belem

Gostou desse artigo?

Não se esqueça de assinar o RSS e divulgue-o para o mundo:

  • 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?
  • 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. :)
  • 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!
  • Tente usar o parâmetro "lr":

    Este argumento opcional permite que o originador da chamada restrinja a
    pesquisa aos documentos escritos em um idioma específico (por exemplo,
    lr=lang_ja). Esta
    lista<http://www.google.com/coop/docs/cse/resultsxml.html#languageCollections>contém
    o conjunto de valores permitidos.
  • 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.
  • Luciano
    e a Codificação?
    acho que esta em UTF-8 como trocar para ISO?
    Abraços!
  • @Luciano
    Procure sobre as funções utf8_decode e utf8_encode... Abraços
  • Muito legal parabens
  • Hiei
    Obrigado,e parabéns pelo seu site!
    Se descobrir mais alguma coisa posta ae no seu blog q eu vou gostar!
  • 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.
  • @Alex
    Não copie e cole o código.. Verifique se ele se adequa ao seu sistema e se está fazendo tudo certinho... Dá uma revisada geral. ;)
  • 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!
  • @Hiei
    Sobre isso não tenho como te responder... É uma API criada pelo próprio Google... Eu apenas mostrei como usá-la.
  • 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...
  • 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..
  • 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...
  • @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. ;)
  • 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...
  • 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!
  • @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.
blog comments powered by Disqus