Como você pode pesquisar a API Java programática do Google [fechado]

105

Alguém sabe se e como é possível pesquisar no Google de forma programática - especialmente se houver uma API Java para isso?

Dan
fonte
Temos suporte para nodejs?
Vinod Kumar Marupu,
Exemplo para pesquisar no Google usando Java - Jsoup HTML Parser: codeforeach.com/java/example-how-to-search-google-using-java
Prashanth

Respostas:

138

Alguns fatos:

  1. O Google oferece uma API de serviço da web de pesquisa pública que retorna JSON : http://ajax.googleapis.com/ajax/services/search/web . Documentação aqui

  2. Java oferece java.net.URLe java.net.URLConnectionpara disparar e manipular solicitações HTTP.

  3. JSON pode ser convertido em Java em um objeto Javabean completo usando uma API JSON Java arbitrária. Um dos melhores é o Google Gson .

Agora faça as contas:

public static void main(String[] args) throws Exception {
    String google = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=";
    String search = "stackoverflow";
    String charset = "UTF-8";

    URL url = new URL(google + URLEncoder.encode(search, charset));
    Reader reader = new InputStreamReader(url.openStream(), charset);
    GoogleResults results = new Gson().fromJson(reader, GoogleResults.class);

    // Show title and URL of 1st result.
    System.out.println(results.getResponseData().getResults().get(0).getTitle());
    System.out.println(results.getResponseData().getResults().get(0).getUrl());
}

Com esta classe Javabean representando os dados JSON mais importantes conforme retornados pelo Google (ela realmente retorna mais dados, mas é deixada para você como um exercício para expandir este código Javabean de acordo):

public class GoogleResults {

    private ResponseData responseData;
    public ResponseData getResponseData() { return responseData; }
    public void setResponseData(ResponseData responseData) { this.responseData = responseData; }
    public String toString() { return "ResponseData[" + responseData + "]"; }

    static class ResponseData {
        private List<Result> results;
        public List<Result> getResults() { return results; }
        public void setResults(List<Result> results) { this.results = results; }
        public String toString() { return "Results[" + results + "]"; }
    }

    static class Result {
        private String url;
        private String title;
        public String getUrl() { return url; }
        public String getTitle() { return title; }
        public void setUrl(String url) { this.url = url; }
        public void setTitle(String title) { this.title = title; }
        public String toString() { return "Result[url:" + url +",title:" + title + "]"; }
    }

}

Veja também:


Atualização desde novembro de 2010 (2 meses após a resposta acima), o serviço da web de busca pública tornou-se obsoleto (e o último dia em que o serviço foi oferecido foi 29 de setembro de 2014). Agora, sua melhor aposta é consultar http://www.google.com/search diretamente com um agente de usuário honesto e, em seguida, analisar o resultado usando um analisador de HTML . Se você omitir o agente do usuário, receberá um 403 de volta. Se você está mentindo no agente do usuário e simula um navegador da web (por exemplo, Chrome ou Firefox), você obtém uma resposta HTML muito maior, o que é um desperdício de largura de banda e desempenho.

Aqui está um exemplo inicial usando Jsoup como analisador de HTML:

String google = "http://www.google.com/search?q=";
String search = "stackoverflow";
String charset = "UTF-8";
String userAgent = "ExampleBot 1.0 (+http://example.com/bot)"; // Change this to your company's name and bot homepage!

Elements links = Jsoup.connect(google + URLEncoder.encode(search, charset)).userAgent(userAgent).get().select(".g>.r>a");

for (Element link : links) {
    String title = link.text();
    String url = link.absUrl("href"); // Google returns URLs in format "http://www.google.com/url?q=<url>&sa=U&ei=<someKey>".
    url = URLDecoder.decode(url.substring(url.indexOf('=') + 1, url.indexOf('&')), "UTF-8");

    if (!url.startsWith("http")) {
        continue; // Ads/news/etc.
    }

    System.out.println("Title: " + title);
    System.out.println("URL: " + url);
}
BalusC
fonte
Muito obrigado - isso não está violando o contrato de licença, conforme mencionado na resposta acima? Agradeço muito o código!
Dan,
11
Observe que a API de pesquisa do Google se tornou obsoleta desde novembro de 2010 (2 meses após a resposta acima ter sido postada). Os usuários finais são incentivados a migrar para a API de pesquisa personalizada do Google: developers.google.com/custom-search/v1/overview
BalusC de
2
@BalusC A pesquisa personalizada do Google não é apenas para pesquisar dentro de um determinado site, e não na web inteira?
Pargat
1
Além disso, e se você não tiver um nome de empresa ou uma página de bot?
Mike Warren
1
Em Scala val searchResults = Jsoup.connect (googleBase + URLEncoder.encode (searchQuery, charset)) .userAgent (userAgent) .get () .select (". G> .r> a");
Vladimir Stazhilov
13

Para pesquisar no google usando a API, você deve usar a Pesquisa personalizada do Google , não é permitido copiar páginas da web

Em java, você pode usar a biblioteca cliente da API CustomSearch para Java

A dependência maven é:

<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-customsearch</artifactId>
    <version>v1-rev57-1.23.0</version>
</dependency> 

Exemplo de pesquisa de código usando a biblioteca cliente da API CustomSearch do Google

public static void main(String[] args) throws GeneralSecurityException, IOException {

    String searchQuery = "test"; //The query to search
    String cx = "002845322276752338984:vxqzfa86nqc"; //Your search engine

    //Instance Customsearch
    Customsearch cs = new Customsearch.Builder(GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), null) 
                   .setApplicationName("MyApplication") 
                   .setGoogleClientRequestInitializer(new CustomsearchRequestInitializer("your api key")) 
                   .build();

    //Set search parameter
    Customsearch.Cse.List list = cs.cse().list(searchQuery).setCx(cx); 

    //Execute search
    Search result = list.execute();
    if (result.getItems()!=null){
        for (Result ri : result.getItems()) {
            //Get title, link, body etc. from search
            System.out.println(ri.getTitle() + ", " + ri.getLink());
        }
    }

}

Como você pode ver, você precisará solicitar uma chave de API e configurar um ID de mecanismo de pesquisa próprio, cx .

Observe que você pode pesquisar em toda a web selecionando "Pesquisar na web inteira" nas configurações da guia básica durante a configuração do cx, mas os resultados não serão exatamente os mesmos de uma pesquisa normal do Google no navegador.

Atualmente (data da resposta) você recebe 100 chamadas de API por dia de graça, então o Google gostaria de compartilhar seu lucro.

Petter Friberg
fonte
12

Nos Termos de Serviço do google podemos ler:

5.3 Você concorda em não acessar (ou tentar acessar) qualquer um dos Serviços por qualquer meio que não seja a interface fornecida pelo Google, a menos que tenha sido especificamente autorizado a fazê-lo em um contrato separado com o Google. Você concorda especificamente em não acessar (ou tentar acessar) qualquer um dos Serviços por meio de qualquer meio automatizado (incluindo o uso de scripts ou rastreadores da web) e deve garantir que cumpre as instruções estabelecidas em qualquer arquivo robots.txt presente nos Serviços .

Então, acho que a resposta é Não. Mais sobre a API SOAP não está mais disponível

Manuel selva
fonte
7
No entanto, a API AJAX é fornecida pelo Google - e, portanto, deve ser utilizável sem violar estes termos de serviço.
Jean Hominal de
Isso provavelmente se aplica a robôs que não estão passando pela API.
James P.
3

O TOS do Google foi relaxado um pouco em abril de 2014. Agora ele afirma:

"Não faça uso indevido de nossos serviços. Por exemplo, não interfira em nossos serviços ou tente acessá-los usando um método diferente da interface e das instruções que fornecemos."

Portanto, a passagem sobre "meios automatizados" e scripts acabou. Evidentemente, ainda não é a forma desejada (pelo Google) de acessar seus serviços, mas acho que agora está formalmente aberta à interpretação do que é exatamente uma "interface" e se faz alguma diferença em como exatamente o HTML retornado é processado ( renderizado ou analisado). De qualquer forma, escrevi uma biblioteca de conveniência Java e cabe a você decidir se vai usá-la ou não:

https://github.com/afedulov/google-web-search

Alex Fedulov
fonte
depois de horas pesquisando por uma solução escrita em java que realmente funcione, sua solução parece ser a maneira mais viável de fazer isso dentro de um ambiente java. A propósito, seu código precisa de alguns ajustes ...
Digao
sinta-se à vontade para abrir um problema no github
Alex Fedulov
2

Na verdade, existe uma API para pesquisar no google de forma programática. A API é chamada de pesquisa personalizada do Google. Para usar esta API, você precisará de uma chave de API de desenvolvedor do Google e uma chave cx. Um procedimento simples para acessar a pesquisa do Google a partir do programa java é explicado no meu blog.

Agora morto, aqui está o link da Wayback Machine .

Sai Sunder
fonte
No seu blog, na parte sobre a chave API, você mencionou algo sobre a chave do servidor, para programas que são escritos em Java. Estou escrevendo o meu em Java e queria saber se devo usar uma chave de servidor e como devo usar minha chave de API em meu programa. Além disso, eu teria que baixar alguma biblioteca?
Mike Warren
0

Como alternativa à resposta BalusC, uma vez que ela se tornou obsoleta e você deve usar proxies, você pode usar este pacote. Amostra de código:

Map<String, String> parameter = new HashMap<>();
parameter.put("q", "Coffee");
parameter.put("location", "Portland");
GoogleSearchResults serp = new GoogleSearchResults(parameter);

JsonObject data = serp.getJson();
JsonArray results = (JsonArray) data.get("organic_results");
JsonObject first_result = results.get(0).getAsJsonObject();
System.out.println("first coffee: " + first_result.get("title").getAsString());

Biblioteca no GitHub

Hartator
fonte
-1

À luz dessas alterações do TOS no ano passado, construímos uma API que dá acesso à pesquisa do Google. Era apenas para nosso próprio uso, mas após alguns pedidos, decidimos abri-lo. Estamos planejando adicionar outros mecanismos de pesquisa no futuro!

Se alguém estiver procurando uma maneira fácil de implementar / adquirir resultados de pesquisa, você está livre para se inscrever e experimentar a API REST: https://searchapi.io

Ele retorna resultados JSON e deve ser fácil de implementar com os documentos detalhados.

É uma pena que o Bing e o Yahoo estejam quilômetros à frente do Google nesse aspecto. Suas APIs não são baratas, mas pelo menos estão disponíveis.

Stan Smulders
fonte