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

2022-08-31 09:57:31

有谁知道是否以及如何以编程方式搜索Google - 特别是如果有Java API?


答案 1

一些事实:

  1. Google提供了一个公共搜索网络服务API,该API返回JSONhttp://ajax.googleapis.com/ajax/services/search/web此处的文档

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

  3. Java中的JSON可以使用任意Java JSON API转换为完全可用的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 + "]"; }
    }

}

###See还:


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

答案 2

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

在java中,您可以使用Java的CustomSearch API Client Library for Java。

专家依赖关系是:

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

使用 Google 自定义搜索 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调用,然后谷歌喜欢分享您的利润。


推荐