- 浏览: 564486 次
- 来自: -
博客专栏
-
libgdx 游戏开发
浏览量:12297
文章分类
- 全部博客 (171)
- OS (1)
- JavaScript (13)
- Struts (2)
- Regular Expression (1)
- Java (14)
- HTML (4)
- XML (1)
- Non-Relational Database (2)
- Miscellaneous (7)
- Lotus Notes (8)
- Algorithm (3)
- Web Analytics (6)
- Web (8)
- Perl (3)
- PHP (3)
- C & C++ (1)
- Shell (7)
- Google (1)
- Android (31)
- iPhone (1)
- SQL (1)
- HTML5 (3)
- jQuery (6)
- CSS (6)
- PostgreSQL (1)
- Design Patterns (1)
- Excel (1)
- Magento (4)
- jMeter (3)
- SEO (1)
- libgdx (5)
- Software (4)
- App (1)
- Game (1)
- Gradle (1)
- Linux (16)
- Ubuntu (4)
- Docker (2)
- Spring (2)
- Other (3)
- Directory Server (1)
- CentOS (1)
- Python (1)
- VCS (3)
- Database (1)
- Open Source (1)
最新评论
-
ls0609:
赞一个,支持下博主。
[原创] Android ListView 在右上角添加三角形图标和文字 -
love297:
不让别人商用,自己先商用起来了。
手机游戏开发展示 -
a851206:
你的有些类是哪里来的?我想研究一下你的程序,可是有些类没有代码 ...
[原创] Google Custom Search & Yahoo Boss Search | Web Search API 使用 -
ypppk:
BitmapFactory.Options options = ...
[原创] 连载 1 - 深入讨论 Android 关于高效显示图片的问题 - 如何高效的加载大位图 -
笑遍世界:
我也遇到了,弄清了其中原因,可参考我的博客:http://sm ...
[原创] 使用 jMeter 登录 Wordpress
[原创] 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:
以下是Junit的测试类:
话外音:前几天上网找资料时,发现自己写的文章被人转载了,心中暗喜。
可是我去发现,该转载者并未标明我的文章原文出处,不标明这个也罢了,
可是转载都竟然连标题都不改(我的文章标题已经写了【原创】二字)。
哎,哪怕你把"【原创】"两字给删了再转载也行啊!
嘿嘿!话外音就说到这吧!开始正文。
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"); } }
发表评论
-
[转] remove on List created by Arrays.asList throws UnsupportedOperationException
2017-08-02 09:30 536原文地址:https://stackoverflow.com/ ... -
[转] JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)
2017-02-04 14:26 2603原文地址: http://www.cnblogs.com/az ... -
java中静态代码块的用法 static用法详解
2013-05-15 11:24 0http://www.cnblogs.com/panjun-D ... -
[原创] Java List/Array 去重
2013-03-06 13:03 2168【说明】 刚刚才发现有这么多的回复!没想到这篇文章会这么容 ... -
[转] Java 随机数 - 生成指定范围的随机数
2012-11-16 16:42 1536大家可以参看原文: http://stackoverflow. ... -
[转] ListResourceBundle doesn't run inside package
2012-11-16 09:29 1049原文地址: http://www.eclipse.org/fo ... -
[转] Java版 中国农历算法 中国农历生成算法
2012-08-06 14:16 1510/** * 實用於公曆 1901 年至 2100 年之 ... -
[原创] Java 天气预告 - htmlparser2.0 + httpclient4.0
2011-01-11 11:16 2622Java控制台版 - 天气预告 前段时间,没事儿的时 ... -
(Original) Nine Palace - Java Implementation - (原创) Java 九宫图 实现
2010-05-26 17:14 1369Some days ago, my girlfrien ... -
原创: Java 删除List中的多余元素 (List 去重)
2010-05-24 16:02 6407如何去除List中重复的数据,可以使用如下的方法。 ... -
Java String 一个简单例子的深思 (对象比较 值相等 相关问题)
2010-05-12 16:19 2050只要是学习过Java的人, ... -
原创: httpclient 4.0 使用 - 访问开心网的各种组件 例子
2010-04-28 09:09 4872在网上查了好长时间,发现httpclient的例子都是 ... -
Java 反射例子详解
2010-04-08 09:02 1213Java编程 的动态性,第 2部分: 引入反射 http:// ... -
JAVA 反射例子
2010-03-29 09:35 1043Java Reflection (JAVA反射) ...
相关推荐
首先,要使用Google Custom Search API,你需要在Google Developers Console上创建一个项目,并启用Custom Search JSON API。然后,创建一个新的Custom Search Engine,设置你要搜索的网站范围。获取到这个引擎的ID...
这对于初学者来说是一个极好的学习资源,他们可以借此了解如何使用Google Custom Search API,并且学习到实际的Web开发技巧,如前后端交互、数据处理等。 至于压缩包内的“google200-master”文件,这通常代表的是...
更多关于谷歌自定义搜索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是Web开发中的一个重要历史案例,它展示了如何利用AJAX技术和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 ...
更新说明1、修改首页栏目相关问题2、修改在微信上资讯详情页发送按钮错位的问题演示内容结构|--- api & WebService Api 数据接口存放目录|--- function & Custom Function Library 自定义函数库|--- images & Img ...
在使用这个类之前,你需要在Google Cloud Console中创建一个项目,启用Custom Search API,并获取一个API密钥和Custom Search Engine ID。这两个值将作为调用API时的凭据。 接下来,`examples.php`文件是展示如何...
谷歌API是Google为开发者提供的一系列接口,允许他们与Google的各种服务...然而,需要注意的是,Google AJAX Search API已在2015年被弃用,现在的开发可能需要转向Google Custom Search JSON API或其他更新的解决方案。
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.
在描述中提到的“相关的WEB页面搜索接口”,指的是Google提供的网页搜索服务API,例如Google Custom Search JSON API或以前的Google Web Search API。这些API允许开发者构建应用程序,向用户展示定制化的搜索结果,...
要使用Google Custom Search API,你需要在Google Cloud Console中创建一个项目,并启用Custom Search JSON API。然后,创建一个自定义搜索引擎,定义它将搜索哪些网站。这个过程涉及到选择“搜索范围”和设置“引索...
在IT行业中,jQuery是一个广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画...然而,需要注意的是,Google Custom Search API可能有使用限制和费用,对于商业用途,需要仔细阅读并遵循Google的服务条款。
而Google自定义搜索引擎(Custom Search JSON API)则允许开发者针对特定网站或一组网站进行定制化的搜索。 首先,你需要在 Google 开发者控制台创建一个新的项目,并启用 Custom Search JSON API。接下来,创建一...
1. **API接口**:Google Custom Search JSON API 提供了与自定义搜索引擎交互的途径。开发者可以通过API发送HTTP请求,获取搜索结果,并将这些结果整合到自己的应用中。 2. **JSON格式**:API返回的数据通常是JSON...
关于Window自画控件CustomDraw,OwnerDraw的好文章
需要注意的是,Google AJAX Search API已经在2015年被弃用,现在推荐使用Google Custom Search JSON API或Google Search Apis for Sheets。虽然AJAX Search API不再维护,但这段代码仍然可以作为一个学习如何与...
3. **API调用与权限管理**:使用Google Custom Search API需要Google Cloud Platform账号,并设置API密钥和自定义搜索引擎ID。在JavaScript中,安全地管理和使用这些凭据是关键,通常会使用异步请求(如AJAX或fetch ...
其次,谷歌搜索引擎API主要指的是Google Custom Search JSON API。这个API允许开发者创建自定义的搜索体验,用户可以在特定的网站集合或者整个互联网上进行搜索。开发者需要创建一个Google Custom Search Engine并...
根据提供的文件信息,本文将详细解析“百度+谷歌搜索模块接口”的相关知识点,包括但不限于其功能、实现方式以及具体的代码示例。 ### 一、百度与谷歌搜索接口概述 #### 1.1 百度搜索接口 百度搜索引擎提供了丰富...
2. **集成Google Custom Search API**: Google提供了Custom Search JSON API,允许开发者自定义搜索体验,包括在特定网站或整个互联网上进行搜索。首先,你需要在Google Developers Console创建一个项目,并启用...