使用Java调用谷歌搜索(转)

31 篇文章 1 订阅
13 篇文章 0 订阅

search-demo托管于github

 

search-demo演示了如何利用Java来调用百度搜索和谷歌搜索,更多细节请到github上查看search-demo

 

自己没搜索引擎,又想要大规模的数据源,怎么办?可以对百度搜索和谷歌搜索善加利用,以小搏大,站在巨人的肩膀上。有很多的应用场景可以很巧妙地借助百度搜索和谷歌搜索来实现,比如网站的新闻采集,比如技术、品牌的新闻跟踪,比如知识库的收集,比如人机问答系统等,我之前做的一个准确率达百分之九十几的人机问答系统的数据源,其中一部分就是充分利用了百度搜索和谷歌搜索。在此演示的技术的基础上,可以容易地扩展到其他的搜索引擎,可以借鉴使用的NekoHTML+XPath或JSoup+CSSPath技术,轻松获取页面的自定义的内容。
 

Java代码   收藏代码
  1. package org.apdplat.demo.search;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.UnsupportedEncodingException;  
  6. import java.net.URLEncoder;  
  7. import java.util.ArrayList;  
  8. import java.util.List;  
  9.   
  10. import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;  
  11. import org.apache.commons.httpclient.HttpClient;  
  12. import org.apache.commons.httpclient.HttpStatus;  
  13. import org.apache.commons.httpclient.methods.GetMethod;  
  14. import org.apache.commons.httpclient.params.HttpMethodParams;  
  15. import org.json.JSONArray;  
  16. import org.json.JSONException;  
  17. import org.json.JSONObject;  
  18. import org.slf4j.Logger;  
  19. import org.slf4j.LoggerFactory;  
  20.   
  21. public class GoogleSearcher implements Searcher{  
  22.     private static final Logger LOG = LoggerFactory.getLogger(GoogleSearcher.class);  
  23.   
  24.     @Override  
  25.     public List<Webpage> search(String url) {  
  26.         List<Webpage> webpages = new ArrayList<>();  
  27.         try {  
  28.             HttpClient httpClient = new HttpClient();  
  29.             GetMethod getMethod = new GetMethod(url);  
  30.   
  31.             httpClient.executeMethod(getMethod);  
  32.             getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,  
  33.                     new DefaultHttpMethodRetryHandler());  
  34.   
  35.             int statusCode = httpClient.executeMethod(getMethod);  
  36.             if (statusCode != HttpStatus.SC_OK) {  
  37.                 LOG.error("搜索失败: " + getMethod.getStatusLine());  
  38.                 return null;  
  39.             }  
  40.             InputStream in = getMethod.getResponseBodyAsStream();  
  41.             byte[] responseBody = Tools.readAll(in);  
  42.             String response = new String(responseBody, "UTF-8");  
  43.             LOG.debug("搜索返回数据:" + response);  
  44.             JSONObject json = new JSONObject(response);  
  45.             String totalResult = json.getJSONObject("responseData").getJSONObject("cursor").getString("estimatedResultCount");  
  46.             int totalResultCount = Integer.parseInt(totalResult);  
  47.             LOG.info("搜索返回记录数: " + totalResultCount);  
  48.   
  49.             JSONArray results = json.getJSONObject("responseData").getJSONArray("results");  
  50.   
  51.             LOG.debug("搜索结果:");  
  52.             for (int i = 0; i < results.length(); i++) {  
  53.                 Webpage webpage = new Webpage();  
  54.                 JSONObject result = results.getJSONObject(i);  
  55.                 //提取标题  
  56.                 String title = result.getString("titleNoFormatting");  
  57.                 LOG.debug("标题:" + title);  
  58.                 webpage.setTitle(title);  
  59.                 //提取摘要  
  60.                 String summary = result.get("content").toString();  
  61.                 summary = summary.replaceAll("<b>""");  
  62.                 summary = summary.replaceAll("</b>""");  
  63.                 summary = summary.replaceAll("\\.\\.\\.""");  
  64.                 LOG.debug("摘要:" + summary);  
  65.                 webpage.setSummary(summary);  
  66.                 //从URL中提取正文  
  67.                 String _url = result.get("url").toString();  
  68.                 webpage.setUrl(_url);  
  69.                 String content = Tools.getHTMLContent(_url);  
  70.                 LOG.debug("正文:" + content);  
  71.                 webpage.setContent(content);  
  72.                 webpages.add(webpage);  
  73.             }  
  74.         } catch (IOException | JSONException | NumberFormatException e) {  
  75.             LOG.error("执行搜索失败:", e);  
  76.         }  
  77.         return webpages;  
  78.     }  
  79.   
  80.     public static void main(String args[]) {  
  81.         String query = "杨尚川";  
  82.         try {  
  83.             query = URLEncoder.encode(query, "UTF-8");  
  84.         } catch (UnsupportedEncodingException e) {  
  85.             LOG.error("url构造失败", e);  
  86.             return;  
  87.         }  
  88.         String url = "http://ajax.googleapis.com/ajax/services/search/web?start=0&rsz=large&v=1.0&q=" + query;  
  89.           
  90.         Searcher searcher = new GoogleSearcher();  
  91.         List<Webpage> webpages = searcher.search(url);  
  92.         if (webpages != null) {  
  93.             int i = 1;  
  94.             for (Webpage webpage : webpages) {  
  95.                 LOG.info("搜索结果 " + (i++) + " :");  
  96.                 LOG.info("标题:" + webpage.getTitle());  
  97.                 LOG.info("URL:" + webpage.getUrl());  
  98.                 LOG.info("摘要:" + webpage.getSummary());  
  99.                 LOG.info("正文:" + webpage.getContent());  
  100.                 LOG.info("");  
  101.             }  
  102.         } else {  
  103.             LOG.error("没有搜索到结果");  
  104.         }  
  105.     }  
  106. }  

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值