如何以编程方式搜索Google Java API [关闭]


105

是否有人知道是否以及如何以编程方式搜索Google(尤其是如果有Java API的话)?


我们支持nodejs吗?
Vinod Kumar Marupu

使用Java搜索Google的示例-Jsoup HTML解析器:codeforeach.com/java/example-how-to-search-google-using-java
Prashanth

Answers:


138

一些事实:

  1. Google提供了返回JSON的公共搜索网络服务API :http : //ajax.googleapis.com/ajax/services/search/web这里的文件

  2. Java提供java.net.URLjava.net.URLConnection触发和处理HTTP请求。

  3. 可以使用任意Java JSON API将Java中的JSON转换为完全有价值的Javabean对象。最好的之一是Google Gson

现在算一下:

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());
}

使用此Javabean类表示Google返回的最重要的JSON数据(它实际上会返回更多数据,但您可以根据自己的意愿来扩展此Javabean代码):

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 + "]"; }
    }

}

也可以看看:


自2010年11月开始更新(上述答案后2个月),公共搜索Web服务已弃用(并且提供该服务的最后一天是2014年9月29日)。现在最好的选择是直接与诚实的用户代理一起查询http://www.google.com/search,然后使用HTML解析器解析结果。如果省略用户代理,则返回403。如果您位于用户代理中并模拟Web浏览器(例如Chrome或Firefox),则返回的HTML响应要大得多,这会浪费带宽和性能。

这是一个使用Jsoup作为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);
}

非常感谢-这不会违反上述答复中提到的许可协议吗?真的很欣赏代码!

11
请注意,自2010年11月(发布上述答案后的2个月)起,不建议使用Google搜索API。鼓励最终用户使用Google自定义搜索API:developers.google.com/custom-search/v1/overview
BalusC 2012年

2
@BalusC Google的自定义搜索不是仅用于在特定网站内搜索,而是在整个网络内搜索?
Pargat 2012年

1
另外,如果您没有公司名称或机器人页面怎么办?
Mike Warren

1
在Scala中,val searchResults = Jsoup.connect(googleBase + URLEncoder.encode(searchQuery,charset)).userAgent(userAgent).get().select(“。g> .r> a”);
弗拉基米尔·斯塔吉洛夫

13

要使用API​​搜索Google,您应该使用Google自定义搜索不允许抓取网页

在Java中,您可以使用Java的CustomSearch API客户端库

Maven依赖项是:

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

使用Google CustomSearch API客户端库搜索的示例代码

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());
        }
    }

}

如您所见,您将需要请求api密钥设置自己的搜索引擎ID cx

请注意,您可以在设置cx的过程中通过在基本标签设置中选择“搜索整个网络”来搜索整个网络,但结果与普通的浏览器google搜索不会完全相同。

目前(答案日期),您每天免费获得100个api调用,然后Google希望分享您的利润。


12

Google服务条款中,我们可以阅读:

5.3您同意不通过Google提供的界面以外的任何方式访问(或尝试访问)任何服务,除非与Google达成的单独协议明确允许您这样做。您明确同意不通过任何自动化方式(包括使用脚本或Web爬网程序)访问(或尝试访问)任何服务,并应确保您遵守服务上存在的任何robots.txt文件中列出的说明。 。

所以我想答案是“否”。不再有关于SOAP API的更多信息。


7
但是,AJAX API由Google提供-因此可以在不违反这些服务条款的情况下使用。
Jean Hominal 2010年

这可能适用于未通过API的机器人。
James P.

3

Google TOS在2014年4月有所放宽。现在它说:

“请勿滥用我们的服务。例如,请勿干扰我们的服务或尝试使用我们提供的界面和说明以外的方法来访问它们。”

因此,有关“自动工具”和脚本的段落现在消失了。显然,这仍然不是访问谷歌服务的理想方式,但是我认为它现在正式可以解释“接口”的确切含义,以及它对于处理返回的HTML是否有任何区别(呈现或解析)。无论如何,我已经编写了一个Java便利性库,由您决定是否使用它:

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


经过数小时的研究,以Java编写的真正有效的解决方案,您的解决方案似乎是在Java环境中执行此操作的最可行方法。您的代码需要顺便进行一些调整...
Digao

随时在github上打开一个问题
Alex Fedulov

2

确实有一个API可以通过编程方式搜索Google。该API称为google自定义搜索。要使用此API,您需要一个Google Developer API密钥和一个cx密钥。我的博客中介绍了一个从Java程序访问Google搜索的简单过程。

现在已经死了,这是Wayback Machine链接


在您的博客中,关于API密钥的部分中,您提到了有关用Java编写的程序的服务器密钥的内容。我正在用Java编写我的代码,想知道是否应该使用服务器密钥,以及如何在程序中使用API​​密钥。另外,我是否需要下载任何库?
Mike Warren

0

作为不推荐使用的BalusC答案的替代方案,您必须使用代理,可以使用此软件包。代码示例:

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

GitHub上的


-1

鉴于去年的TOS变更,我们构建了一个API,可以访问Google的搜索。它仅供我们自己使用,但是在某些要求之后,我们决定将其打开。我们计划在将来添加其他搜索引擎!

如果有人在寻找实现/获取搜索结果的简便方法,则可以自由注册并尝试使用REST API:https : //searchapi.io

它返回JSON结果,并且应该足够容易使用详细文档来实现。

Bing和Yahoo在这方面在Google方面遥遥领先,真是可惜。它们的API并不便宜,但至少可用。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.