`
yhz61010
  • 浏览: 561423 次
  • 来自: -
博客专栏
63c13ecc-ef01-31cf-984e-de461c7dfde8
libgdx 游戏开发
浏览量:12245
社区版块
存档分类
最新评论

[原创] Google Custom Search & Yahoo Boss Search | Web Search API 使用

    博客分类:
  • Java
阅读更多
引用本文时,请标明本文地址

    话外音:前几天上网找资料时,发现自己写的文章被人转载了,心中暗喜。
可是我去发现,该转载者并未标明我的文章原文出处,不标明这个也罢了,
可是转载都竟然连标题都不改(我的文章标题已经写了【原创】二字)。
哎,哪怕你把"【原创】"两字给删了再转载也行啊!
    嘿嘿!话外音就说到这吧!开始正文。

    Google和Yahoo的新Web Search API已经升级了一段时间了,最近正好
有项目要做相关的API升级,因此就对新的API进行了调查,并写了perl和java
的例子。现将java例子的主要代码与大家分享下。

API简介:
Google升级后的Web Search叫"Google Custom Search"(简称CSE),
Yahoo升级后的Web Search叫"Yahoo! Search BOSS",

二者都采用REST的方式进行调用,并且都支持JSON格式的返回结果。
以下例子,就是对Google CSE的基本使用加以说明,并且处理JSON形式的返回结果。

由于两者都是RESTful的,因此Yahoo的例子这里就不贴出来了
(因为可以很方便的根据下面的例子,改成Yahoo的),大家可能参考下
Google的例子,自己改写成支持"Yahoo! Search BOSS"。

本例子使用了httpclient4 + google cse api + json
httpclient4的使用入门,大家可以参考我写的如下文章:
http://yhz61010.iteye.com/blog/654678

本类功能说明:
1. 按指定关键字进行结果检索。
2. 查找指定的关键字或URL在Google上的排名。

以下是主类的详细source:
/**
 * Google Custom Search Engine
 * 
 * @author Michael Leo
 * @version 1.0 2011/01/24
 */
public class GoogleCSE {
	protected static final Class<GoogleCSE> clazz = GoogleCSE.class;

	private String cseKey = "Your custom search id";

	private String apiConsoleKey = "Your console api id";

	private String keyword = "Google";

	private String language;

	private int num = 10;

	private int start = 1;

	private String uri;

	public List<RankBean> getRank(String[] targetWords, String[] targetUrls,
			Map<String, Object> result) {
		if (targetWords == null && targetUrls == null) {
			Log.log(LogLevel.DEBUG, clazz,
					"Both of target words and urls are null.");
			return null;
		}
		ResponseBean res = (ResponseBean) result.get("response");
		int startIndex = res.getQueries().getRequest().get(0).getStartIndex();

		List<RankBean> rank = new ArrayList<RankBean>();

		@SuppressWarnings("unchecked")
		List<ItemsBean> list = (List<ItemsBean>) result.get("items");
		String link = null;
		String title = null;
		String snippet = null;
		for (int i = 0; i < list.size(); i++) {
			link = list.get(i).getLink();
			title = list.get(i).getTitle();
			snippet = list.get(i).getSnippet();
			for (int j = 0; targetWords != null && j < targetWords.length; j++) {
				if (title.indexOf(targetWords[j]) > -1
						|| snippet.indexOf(targetWords[j]) > -1) {
					RankBean ranking = new RankBean();
					ranking.setRank(startIndex + i);
					try {
						BeanUtils.copyProperties(ranking, list.get(i));
					} catch (Exception e) {
						Log.log(LogLevel.DEBUG, clazz,
								"Can't copy properties: targetWords");
					}
					rank.add(ranking);
				}
			}
			for (int k = 0; targetUrls != null && k < targetUrls.length; k++) {
				if (link.indexOf(targetUrls[k]) > -1) {
					RankBean ranking = new RankBean();
					ranking.setRank(startIndex + i);
					try {
						BeanUtils.copyProperties(ranking, list.get(i));
					} catch (Exception e) {
						Log.log(LogLevel.DEBUG, clazz,
								"Can't copy properties: targetUrls");
					}
					rank.add(ranking);
				}
			}
		}

		return RemoveDuplication.removeDuplication(rank, "link");
	}

	public NextPageBean nextPageInfo(Map<String, Object> result) {
		ResponseBean res = (ResponseBean) result.get("response");
		if (res.getQueries().getNextPage() == null) {
			return null;
		}
		return res.getQueries().getNextPage().get(0);
	}

	public Map<String, Object> execute() throws Exception {
		Map<String, Object> result = new HashMap<String, Object>();

		DefaultHttpClient httpclient = new DefaultHttpClient();

		List<NameValuePair> params = new ArrayList<NameValuePair>();
		params.add(new BasicNameValuePair("alt", "json"));
		params.add(new BasicNameValuePair("cx", cseKey));
		params.add(new BasicNameValuePair("key", apiConsoleKey));
		params.add(new BasicNameValuePair("q", keyword));
		if (StringUtils.isNotBlank(language)) {
			params.add(new BasicNameValuePair("lr", language));
		}
		params.add(new BasicNameValuePair("num", String.valueOf(num)));
		params.add(new BasicNameValuePair("start", String.valueOf(start)));
		URI uri = URIUtils.createURI("https", "www.googleapis.com", -1,
				"/customsearch/v1", URLEncodedUtils.format(params, "UTF-8"),
				null);

		HttpGet httpget = new HttpGet(uri);
		this.uri = httpget.getURI().toString();
		Log.log(LogLevel.DEBUG, clazz, this.uri);

		HttpResponse response = httpclient.execute(httpget);
		HttpEntity entity = response.getEntity();

		if (entity != null) {
			entity = new BufferedHttpEntity(entity);
		} else {
			Log.log(LogLevel.DEBUG, clazz, "Entity is null.");
			return null;
		}

		String strResponse = EntityUtils.toString(entity, HTTP.UTF_8);
		JSONObject json = JsonUtils.object2Json(strResponse);

		Map<String, Class<?>> classMap = new HashMap<String, Class<?>>();
		classMap.put("bodyLines", BodyLinesBean.class);
		classMap.put("context", ContextBean.class);
		classMap.put("items", ItemsBean.class);
		classMap.put("nextPage", NextPageBean.class);
		classMap.put("previousPage", PreviousPageBean.class);
		classMap.put("promotions", PromotionsBean.class);
		classMap.put("queries", QueriesBean.class);
		classMap.put("request", RequestBean.class);
		classMap.put("url", UrlBean.class);
		classMap.put("pagemap", PageMapBean.class);
		classMap.put("metatags", MetatagsBean.class);
		classMap.put("person", PersonBean.class);
		classMap.put("hcard", HcardBean.class);
		classMap.put("Movie", MovieBean.class);
		classMap.put("moviereview", MovieReviewBean.class);
		classMap.put("error", ErrorBean.class);
		classMap.put("errors", ErrorsBean.class);
		ResponseBean res = JsonUtils.json2Object(json, ResponseBean.class,
				classMap);

		if (res.getError() != null) {
			result.put("error", res.getError());
		} else {
			result.put("totalResults", res.getQueries().getRequest().get(0)
					.getTotalResults());
			result.put("count", res.getQueries().getRequest().get(0).getCount());
			result.put("startIndex", res.getQueries().getRequest().get(0)
					.getStartIndex());
			result.put("items", res.getItems());
			result.put("response", res);
		}

		return result;
	}
}


以下是Junit的测试类:

/**
 * Google CSE Test
 * 
 * @author Michael Leo
 * @version 2011/01/25
 */
public class GoogleCSETest {
	@Test
	public void case01() throws Exception {
		P.p("Google CSE - Start.");
		P.p();
		long ast = System.currentTimeMillis();
		long aed = 0;

		long st = 0;
		long ed = 0;

		GoogleCSE cse = new GoogleCSE();		
		cse.setApiConsoleKey("Your console api key");

		cse.setCseKey("Your cse key");
		cse.setKeyword("Google");
		cse.setLanguage("lang_zh-CN");
		cse.setNum(10);

		NextPageBean np = null;
		@SuppressWarnings("unused")
		int index = 1;
		ErrorBean err = null;
		do {
			st = System.currentTimeMillis();
			Map<String, Object> result = cse.execute();
			if ((err = (ErrorBean) result.get("error")) != null) {
				P.p("Error code: " + err.getCode());
				P.p("Message: " + err.getMessage());
				return;
			}
			np = cse.nextPageInfo(result);
			if (np != null) {
				cse.setStart(np.getStartIndex());
			}

			int startIndex = ((ResponseBean) result.get("response"))
					.getQueries().getRequest().get(0).getStartIndex();
			P.p("Start index: " + startIndex);
			P.p("Query url:\n" + cse.getUri());
			P.p("totalResults: "
					+ MiscellaneousUtils.formatNumber(result
							.get("totalResults")));

			// @SuppressWarnings("unchecked")
			// List<ItemsBean> list = (List<ItemsBean>) result.get("items");
			//
			// for (int i = 0; i < list.size(); i++) {
			// P.p(index++ + ": " + list.get(i).getTitle());
			// P.p(list.get(i).getSnippet());
			// P.p(list.get(i).getLink());
			// P.p();
			// }

			String[] targetWords = { "Google Chrome" };
			String[] targetUrls = { "google.com" };
			List<RankBean> ranking = cse.getRank(targetWords, targetUrls,
					result);

			for (int i = 0; i < ranking.size(); i++) {
				P.p();
				P.p("Rank: " + ranking.get(i).getRank());
				P.p(ranking.get(i).getTitle());
				P.p(ranking.get(i).getSnippet());
				P.p(ranking.get(i).getLink());
			}

			ed = System.currentTimeMillis();
			P.p("Cost: " + (ed - st) / 1000.0 + "s");
			P.p();
		} while (np != null);
		aed = System.currentTimeMillis();
		P.p("Google CSE - Finished.");
		P.p("Cost: " + (aed - ast) / 1000.0 + "s");
	}
}


3
1
分享到:
评论
1 楼 a851206 2014-02-28  
你的有些类是哪里来的?我想研究一下你的程序,可是有些类没有代码,运行不了

相关推荐

    Google Custom Search API应用实例

    首先,要使用Google Custom Search API,你需要在Google Developers Console上创建一个项目,并启用Custom Search JSON API。然后,创建一个新的Custom Search Engine,设置你要搜索的网站范围。获取到这个引擎的ID...

    google200, 基于google custom search api的google搜索镜像.zip

    这对于初学者来说是一个极好的学习资源,他们可以借此了解如何使用Google Custom Search API,并且学习到实际的Web开发技巧,如前后端交互、数据处理等。 至于压缩包内的“google200-master”文件,这通常代表的是...

    Google custom search engine

    更多关于谷歌自定义搜索JSON API的信息,可以参考官方文档:https://developers.google.com/custom-search/json-api/v1/overview?hl=zh_CN **四、创建自定义搜索引擎并获取CX** 1. 创建自定义搜索引擎:登录到...

    利用Google AJAX Search API

    **利用Google AJAX Search API** ...总之,Google AJAX Search API是Web开发中的一个重要历史案例,它展示了如何利用AJAX技术和API接口提升用户体验。虽然现在已经不再使用,但其背后的原理和技术仍然值得学习和借鉴。

    Google AJAX Search API

    The Map Search Control is a simple to use application of the Google AJAX Search API that is designed to let you easily add a searchable map to your pages, sites, and blogs. The control on the right ...

    google search close 谷歌搜索类

    在使用这个类之前,你需要在Google Cloud Console中创建一个项目,启用Custom Search API,并获取一个API密钥和Custom Search Engine ID。这两个值将作为调用API时的凭据。 接下来,`examples.php`文件是展示如何...

    官方google API

    谷歌API是Google为开发者提供的一系列接口,允许他们与Google的各种服务...然而,需要注意的是,Google AJAX Search API已在2015年被弃用,现在的开发可能需要转向Google Custom Search JSON API或其他更新的解决方案。

    ASP.NET Web API 2 Recipes(英文pdf)

    Author: Filip Wojcieszyn ISBN-10: 1430259809 Year: 2014 Pages: 408 Language: English ... Find out how you can build custom web services with ASP.NET Web API more efficiently than ever.

    googleapi.jar

    在描述中提到的“相关的WEB页面搜索接口”,指的是Google提供的网页搜索服务API,例如Google Custom Search JSON API或以前的Google Web Search API。这些API允许开发者构建应用程序,向用户展示定制化的搜索结果,...

    android_google_search_demo

    要使用Google Custom Search API,你需要在Google Cloud Console中创建一个项目,并启用Custom Search JSON API。然后,创建一个自定义搜索引擎,定义它将搜索哪些网站。这个过程涉及到选择“搜索范围”和设置“引索...

    Jquery调用Google搜索API实现搜索引擎.rar

    在IT行业中,jQuery是一个广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画...然而,需要注意的是,Google Custom Search API可能有使用限制和费用,对于商业用途,需要仔细阅读并遵循Google的服务条款。

    Laravel开发-googlesearch

    而Google自定义搜索引擎(Custom Search JSON API)则允许开发者针对特定网站或一组网站进行定制化的搜索。 首先,你需要在 Google 开发者控制台创建一个新的项目,并启用 Custom Search JSON API。接下来,创建一...

    google api 自定义搜索引擎

    1. **API接口**:Google Custom Search JSON API 提供了与自定义搜索引擎交互的途径。开发者可以通过API发送HTTP请求,获取搜索结果,并将这些结果整合到自己的应用中。 2. **JSON格式**:API返回的数据通常是JSON...

    customdraw & ownerdraw

    关于Window自画控件CustomDraw,OwnerDraw的好文章

    google_API接口

    需要注意的是,Google AJAX Search API已经在2015年被弃用,现在推荐使用Google Custom Search JSON API或Google Search Apis for Sheets。虽然AJAX Search API不再维护,但这段代码仍然可以作为一个学习如何与...

    vela-data-scraping-aka-MMT:此存储库专用于数据删除,其中包括使用Google Custom Search API的Google搜索结果

    3. **API调用与权限管理**:使用Google Custom Search API需要Google Cloud Platform账号,并设置API密钥和自定义搜索引擎ID。在JavaScript中,安全地管理和使用这些凭据是关键,通常会使用异步请求(如AJAX或fetch ...

    百度、谷歌搜索引擎API.zip

    其次,谷歌搜索引擎API主要指的是Google Custom Search JSON API。这个API允许开发者创建自定义的搜索体验,用户可以在特定的网站集合或者整个互联网上进行搜索。开发者需要创建一个Google Custom Search Engine并...

    百度+谷歌 搜索模块接口

    根据提供的文件信息,本文将详细解析“百度+谷歌搜索模块接口”的相关知识点,包括但不限于其功能、实现方式以及具体的代码示例。 ### 一、百度与谷歌搜索接口概述 #### 1.1 百度搜索接口 百度搜索引擎提供了丰富...

    google核心搜索jsp实现方式

    2. **集成Google Custom Search API**: Google提供了Custom Search JSON API,允许开发者自定义搜索体验,包括在特定网站或整个互联网上进行搜索。首先,你需要在Google Developers Console创建一个项目,并启用...

    elasticsearch7.17.10版本分词器插件安装包

    作为一个强大的全文搜索引擎,Elasticsearch允许用户通过简单的API进行数据索引、搜索、分析和可视化。然而,为了更好地处理中文等复杂语言,我们需要安装合适的分词器插件。这里我们将详细介绍如何为Elasticsearch ...

Global site tag (gtag.js) - Google Analytics