Alguém sabe se e como é possível pesquisar no Google de forma programática - especialmente se houver uma API Java para isso?
Alguém sabe se e como é possível pesquisar no Google de forma programática - especialmente se houver uma API Java para isso?
Respostas:
Alguns fatos:
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
Java oferece java.net.URL
e java.net.URLConnection
para disparar e manipular solicitações HTTP.
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 + "]"; }
}
}
java.net.URLConnection
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);
}
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.
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
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:
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 .
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
À 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.
Apenas uma alternativa. Pesquisar no google e analisar os resultados também pode ser feito de uma forma genérica usando qualquer analisador de HTML, como Jsoup em Java. A seguir está o link para o exemplo mencionado.
https://www.codeforeach.com/java/example-how-to-search-google-using-java