Google Custom Search API使用详解


      最近工作不是很忙,利用业余时间学习了google的文档。Google对外提供的API功能十分强大,由于篇幅有限,这里仅说一下Google Custom Search API。这个api提供了搜索的功能,可以搜索图片和文字信息,并以Json的形式返回结果。我们在实际开发中无需引入任何Jar包,仅需调用google的服务即可,非常的好用,下面我会以一个demo项目的形式。

首先Google的东西,当然要看一手的官方文档。


 

翻译如下:谷歌定制搜索API可以为web程序或桌面程序通过编程的方式提供检索和展现的功能,使用谷歌定制搜索API,你就可以使用RESTful架构的请求网站搜索或者图片搜索,结果以JSONAtom的格式返回。  PS:默认返回JSON格式



翻译如下:通过调用API,用户的请求对应订制搜索引擎的实例,因此,在使用这个API之前,你需要生成一个ID,在谷歌官网ControlPanel中的Setup Basics > Details获取这个ID





值得注意的是,我看到很多文章提到需要拿到一个api key,老版本确实需要一个key,但是现在的googlecustom search api 已经不需要apikey了。

好了,以上准备工作就绪,下面就开始开发一个DemoProject了。


第一步:申请一个Google帐号并登录,创建一个自己的项目,自定义一个搜索引擎实例。拿到 ID(作为cs参数)。




第二步:新建一个Web  Project。定义几个bean,其中包括文字索引查询结果类SearchResultItem类,图片查询结果类SearchResultImage类,查询结果类SearchResult类,图片类Image

     

         

在此由于篇幅有限,bean的相关代码不贴上来了。(如果需要可以下面给我留言)

第三步:写一个servlet,做查询动作,并把结果返回回页面

package google.custom.search.api.servlet;

import google.custom.search.api.bean.Image;
import google.custom.search.api.bean.SearchResult;
import google.custom.search.api.bean.SearchResultItem;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.gson.Gson;

/**
 * Author:wangjian
 */
public class GoogleCustomSearchAPIServlet extends HttpServlet {

	// 最大返回结果数
	private static final int RESULT_OK = 200;
	// 8KB
	private static final int BUF_SIZE = 1024 * 8;
	
	// 自定义搜索引擎的ID 
	private static final String ID = "010589607068358538435:p8ot8fmvira"; 
																			

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		handle(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		handle(request, response);
	}


	private void handle(HttpServletRequest request, HttpServletResponse response)
			throws IOException {
		int start = Integer.parseInt(request.getParameter("start"));
		int num = Integer.parseInt(request.getParameter("num"));
		String queryExpression = request.getParameter("queryexpression");
		String strRequest = "https://www.google.com:443/cse/publicurl?cx="
				+ ID
				+ "&q=%queryExpression%&searchType=image&start=%start%&num=%num%";
		strRequest = strRequest.replace("%queryExpression%", queryExpression)
				.replace("%start%", String.valueOf(start))
				.replace("%num%", Integer.toString(num));

		HttpURLConnection conn = null;
		String queryResult = null;
		try {
			URL url = new URL(strRequest);
			conn = (HttpURLConnection) url.openConnection();
			// 使用GET方法
			conn.setRequestMethod("GET");
			int resultCode = conn.getResponseCode();
			if (resultCode == RESULT_OK) {
				InputStream is = conn.getInputStream();
				queryResult = readAsString(is);
				is.close();
			} else {
				System.out.println("Fault on getting http result, code: "
						+ resultCode);
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			conn.disconnect();
		}

		if ((queryResult != null) && (queryResult.length() != 0)) {
			String respStr = parseResult(queryResult);
			System.out.println(respStr);

			// 设置返回JSON内容
			response.setContentType("application/json; charset=utf-8");
			// 设置不缓存内容
			response.setHeader("pragma", "no-cache");
			response.setHeader("cache-control", "no-cache");
			PrintWriter writer = response.getWriter();
			writer.write(respStr);
			writer.flush();
			writer.close();
		}
	}

	/**
	 * 将搜索结果字符串转化为需要的对象列表
	 * 
	 * @param queryResult
	 * @return
	 */
	private String parseResult(String queryResult) {
		Gson gson = new Gson();
		SearchResult e = gson.fromJson(queryResult, SearchResult.class);
		System.out.println(queryResult);
		SearchResultItem items[] = e.getItems();
		Image images[] = new Image[items.length];
		for (int i = 0; i < items.length; i++) {
			images[i] = new Image(items[i].title, items[i].link,
					items[i].displayLink);
		}
		return gson.toJson(images);
	}

	/**
	 * 将输出内容转换为字符串形式
	 * 
	 * @param ins
	 * @return
	 * @throws IOException
	 */
	public static String readAsString(InputStream ins) throws IOException {
		ByteArrayOutputStream outs = new ByteArrayOutputStream();
		byte[] buffer = new byte[BUF_SIZE];
		int len = -1;
		try {
			while ((len = ins.read(buffer)) != -1) {
				outs.write(buffer, 0, len);
			}
		} finally {
			outs.flush();
			outs.close();
		}
		return outs.toString();
	}

}

第四步:将查询结果返回到前台页面:
     

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>csdn网站即时搜索</title>





<script type="text/javascript" src="../jquery/jquery-1.8.2.js"></script>  
    <script type="text/javascript">  
    $(function(){  
        $("#search").click(function(){  
                $.post("/GoogleCustomSearchAPIServlet",   
                    {"start": $("#start").val(), "num": $("#num").val(), "queryexpression": $("#queryexpression").val()},   
                    function(data, status){                       
                        var html = "<table style='width: 960px; border: 1px solid black;'>";  
                        for(var i = 0; i < data.length; i++){  
                            if (i % 3 == 0)  
                                html += "<tr>";  
                            var image = data[i];  
                            var title = image.title;  
                            var link = image.link;  
                            var displayLink = image.displayLink;  
                            html += "<td style='width: 320px'>" + title + "<img src='" + link + "' width='320px' height='240px'>" + displayLink + "</td>";  
                              
                            if (i % 3 == 2)  
                                html += "</tr>";  
                        }  
                        html += "</table>";  
                        $("table:eq(0)").remove();  
                        $("#resultArea").append(html);  
                    });  
        });  
    });  
          
    </script>  








</head>
<body>
    <div id="searchbox" style="width:80%;display:block;margin:0 auto;">
        <input type="text" name="field" id="field" style="width:100%;height:50px;margin-top:50px;font-size:40px;" οnkeyup="sendQuery();" />
    </div>
    <div id="main-content">
      <div id="cse_g" style="margin:20px;"></div>
 </div>
 
 
 <div><script>
//在Google网站上自定义一个搜索引擎(搜索www.csdn.net的内容,返回一个一段HTML页面代码,用于查询和返回结果)
  (function() {
    var cx = '010589607068358538435:p8ot8fmvira';
    var gcse = document.createElement('script');
    gcse.type = 'text/javascript';
    gcse.async = true;
    gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
        '//www.google.com/cse/cse.js?cx=' + cx;
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(gcse, s);
  })();
</script>
<gcse:search></gcse:search></div>



 <label for="queryexpression">搜索内容</label>  
  <input type="text" id="queryexpression">  
  <label for="start">从第几个结果开始</label>  
  <input type="text" id="start">  
  <label for="num">搜索多少结果</label>  
  <input type="text" id="num">  
  <input type="button" id="search" value="搜索">  
    
  <div id="resultArea"></div>  
</body>
</html>

 

 

 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值