【问题标题】:How can you search Google Programmatically Java API [closed]您如何以编程方式搜索 Google Java API [关闭]
【发布时间】:2010-09-16 14:28:23
【问题描述】:

有谁知道是否以及如何以编程方式搜索 Google - 尤其是在有 Java API 的情况下?

【问题讨论】:

标签: java google-search-api


【解决方案1】:

一些事实:

  1. Google 提供了一个公共搜索网络服务 API,它返回 JSON: http://ajax.googleapis.com/ajax/services/search/webDocumentation here

  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 个月)以来,公共搜索网络服务已弃用(并且提供该服务的最后一天是 9 月2014 年 2 月 29 日)。现在最好的办法是直接与诚实的用户代理一起查询http://www.google.com/search,然后使用HTML parser 解析结果。如果省略用户代理,则会返回 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);
}

【讨论】:

  • 非常感谢 - 这不是违反上述答案中提到的许可协议吗?非常感谢代码!
  • 请注意,Google 搜索 API 自 2010 年 11 月(上述答案发布 2 个月后)起已弃用。鼓励最终用户迁移到 Google 自定义搜索 API:developers.google.com/custom-search/v1/overview
  • @BalusC 谷歌的自定义搜索不是仅用于在特定网站内搜索而不是在整个网络中搜索吗??
  • 另外,如果您没有公司名称或机器人页面怎么办??
  • 在 Scala 中 val searchResults = Jsoup.connect(googleBase + URLEncoder.encode(searchQuery, charset)) .userAgent(userAgent) .get() .select(".g>.r>a") ;
【解决方案2】:

使用API​​搜索google你应该使用Google Custom Search,抓取网页是not allowed

在java中你可以使用CustomSearch API Client Library for Java

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

}

如您所见,您需要request an api keysetup an own search engine id, cx

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

目前(答复日期)您每天免费获得 100 次 api 调用,然后 google 愿意分享您的利润。

【讨论】:

    【解决方案3】:

    Terms of Service of google我们可以阅读:

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

    所以我猜答案是否定的。更多的 SOAP API 不再可用

    【讨论】:

    • 但是,AJAX API 由 Google 提供 - 因此应该可以在不违反这些服务条款的情况下使用。
    • 这可能适用于不通过 API 的机器人。
    【解决方案4】:

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

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

    所以关于“自动化手段”和脚本的文章现在已经消失了。显然,它仍然不是访问他们服务的理想(谷歌)方式,但我认为现在正式开放解释“接口”到底是什么,以及它是否对返回的 HTML 的处理方式有任何影响(渲染或解析)。无论如何,我已经编写了一个 Java 便利库,您可以决定是否使用它:

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

    【讨论】:

    • 经过数小时研究以寻找真正有效的用 java 编写的解决方案后,您的解决方案似乎是在 java 环境中执行此操作的最可行方法。顺便说一下,您的代码需要一些调整...
    • 欢迎在 github 上提出问题
    【解决方案5】:

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

    现在死了,这里是the Wayback Machine link

    【讨论】:

    • 在您的博客中,关于 API 密钥的部分,您提到了一些关于服务器密钥的内容,适用于用 Java 编写的程序。我正在用 Java 编写我的,并且想知道我是否应该使用服务器密钥,以及如何在我的程序中使用我的 API 密钥。另外,我需要下载任何库吗?
    【解决方案6】:

    作为 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 上的库

    【讨论】:

      【解决方案7】:

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

      如果有人正在寻找一种简单的方法来实现/获取搜索结果,您可以免费注册并试用 REST API:https://searchapi.io

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

      遗憾的是,Bing 和雅虎在这方面比 Google 遥遥领先。他们的 API 并不便宜,但至少可用。

      【讨论】:

        猜你喜欢
        • 2023-03-12
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-16
        • 1970-01-01
        • 2010-10-08
        相关资源
        最近更新 更多