当前位置:  开发笔记 > 编程语言 > 正文

如何在Google Programmatically Java API中搜索

如何解决《如何在GoogleProgrammaticallyJavaAPI中搜索》经验,为你挑选了3个好方法。

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



1> BalusC..:

一些事实:

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

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

    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 results;
        public List getResults() { return results; }
        public void setResults(List 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 + "]"; }
    }

}

也可以看看:

如何使用激活和处理HTTP请求 java.net.URLConnection

如何将JSON转换为Java


自2010年11月更新(上述答案后2个月),公共搜索网络服务已被弃用(提供服务的最后一天是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=&sa=U&ei=".
    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 Search API自2010年11月起已被弃用(上述答案发布后2个月).我们鼓励最终用户使用Google Custom Search API:https://developers.google.com/custom-search/v1/overview
@BalusC谷歌的自定义搜索不仅仅是在特定网站内搜索而不是整个网站?

2> Manuel Selva..:

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

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

所以我猜答案是否定的.更多关于SOAP API的内容已不再可用


但是,AJAX API由Google提供 - 因此应该可以在不违反这些服务条款的情况下使用.

3> Petter Fribe..:

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

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

maven依赖是:


    com.google.apis
    google-api-services-customsearch
    v1-rev57-1.23.0
 

使用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期间在基本选项卡设置上选择"搜索整个网络"来搜索整个网络,但结果与普通浏览器谷歌搜索不会完全相同.

目前(回答日期)您每天免费获得100个api电话,然后谷歌喜欢分享您的利润.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有