- 浏览: 550509 次
- 来自: -
博客专栏
-
libgdx 游戏开发
浏览量:11947
文章分类
- 全部博客 (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 467原文地址:https://stackoverflow.com/ ... -
[转] JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)
2017-02-04 14:26 2558原文地址: 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 2116【说明】 刚刚才发现有这么多的回复!没想到这篇文章会这么容 ... -
[转] Java 随机数 - 生成指定范围的随机数
2012-11-16 16:42 1459大家可以参看原文: http://stackoverflow. ... -
[转] ListResourceBundle doesn't run inside package
2012-11-16 09:29 991原文地址: http://www.eclipse.org/fo ... -
[转] Java版 中国农历算法 中国农历生成算法
2012-08-06 14:16 1458/** * 實用於公曆 1901 年至 2100 年之 ... -
[原创] Java 天气预告 - htmlparser2.0 + httpclient4.0
2011-01-11 11:16 2558Java控制台版 - 天气预告 前段时间,没事儿的时 ... -
(Original) Nine Palace - Java Implementation - (原创) Java 九宫图 实现
2010-05-26 17:14 1329Some days ago, my girlfrien ... -
原创: Java 删除List中的多余元素 (List 去重)
2010-05-24 16:02 6346如何去除List中重复的数据,可以使用如下的方法。 ... -
Java String 一个简单例子的深思 (对象比较 值相等 相关问题)
2010-05-12 16:19 1983只要是学习过Java的人, ... -
原创: httpclient 4.0 使用 - 访问开心网的各种组件 例子
2010-04-28 09:09 4797在网上查了好长时间,发现httpclient的例子都是 ... -
Java 反射例子详解
2010-04-08 09:02 1163Java编程 的动态性,第 2部分: 引入反射 http:// ... -
JAVA 反射例子
2010-03-29 09:35 988Java Reflection (JAVA反射) ...
相关推荐
Google Custom Search API应用实例,用C#语言编写
Google custom search engine, call Google's 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 ...
google200, 基于google custom search api的google搜索镜像
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.
关于Window自画控件CustomDraw,OwnerDraw的好文章
android上使用google提供的Custom Search API.
CoCServer-1-v15-U2 (Custom & CoC Mods - Unlimited).apk
vela-data-scraping-aka-MMT 此存储库专用于数据收集,其中包括使用Google Custom Search API的Google搜索结果。
默认设置:滚动距离:90%(不带扩展名,则减少10%)动画:启用动画持续时间:250ms某些网站可能使用冲突的脚本。您是否应该在任何网站上发现任何问题。请报告您可能会发现的任何此类问题,我们将尽力解决这些问题...
默认设置:滚动距离:90%(不带扩展名,则减少10%)动画:启用动画持续时间:250ms某些网站可能使用冲突的脚本。 您是否应该在任何网站上发现任何问题。 请报告您可能会发现的任何此类问题,我们将尽力解决这些...
Mining Google Web Services: Building Applications with the Google API by John Paul Mueller ISBN:0782143334 Sybex © 2004 (361 pages) Learn how to embed the popular search engine in a web site, ...
Custom Phone - 4.1.1 - API 16 - 768x1280,
使用Custom Control自定义控件 使用Custom Control自定义控件 使用Custom Control自定义控件
Harness the power of ElasticSearch to build and manage scalable search and analytics solutions with this fast-paced guide About This Book New to ElasticSearch? Here's what you need―a highly ...
百度 谷歌 搜索 接口 百度 谷歌 搜索 接口 百度 谷歌 搜索 接口
Learn how to embed the popular search engine in a web site, create applications for optimizing complex searches, automatically monitor the web for specified information, develop custom applications to...
Google 自定义搜索 API 示例 使用 MEAN.io 框架 Google 自定义搜索 API 示例,构建在MEAN.io框架之上。 从 MEAN 堆栈应用程序调用第三方 Web API 的示例。 从客户端 (AngularJS) 和后端 (Node.js) 调用 Web API。 此...
Elasticsearch makes it easy to add efficient and scalable searches to ... Elasticsearch is miles deep, so once it's up and running, it can be used to build nearly any custom search solution imaginable.
防止Google Chrome自动添加自定义搜索引擎(也称为“OpenSearch”)。 阻止网站使用此简单扩展名添加自定义搜索引擎。此扩展名不连接到任何第三方服务器。其源代码可在以下位置获得:...