热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

抓取百度联想词配合jqueryautocomplete插件,轻松达到百度首页搜索自动提示效果。...

最近项目中很多文本框用需要用jquery-autocomplete插件做自动提示,以增强用户体验,但是出现的问题是,要很多自动显示的词&#

最近项目中很多文本框用需要用jquery-autocomplete插件做自动提示,以增强用户体验,但是出现的问题是,要很多自动显示的词,怎么办?

于是借助公司另外一个项目的经验(算是山寨吧!),干脆把百度首页的自动提示移植到项目中。

先贴效果,这是百度首页

这是demo效果

实现方式蛮简单的,用firebug获取文本框触发事件响应url就行了。

工具类代码如下

1 import java.io.IOException;
2 import java.io.InputStream;
3 import java.io.InputStreamReader;
4 import java.io.UnsupportedEncodingException;
5 import java.net.HttpURLConnection;
6 import java.net.MalformedURLException;
7 import java.net.URL;
8 import java.net.URLEncoder;
9 import java.util.ArrayList;
10 import java.util.List;
11 import java.util.regex.Matcher;
12 import java.util.regex.Pattern;
13 import net.sf.json.JSONArray;
14
15 public class BaiduSuggestionUtil {
16 /**
17 * 获取百度的联想词
18 *
19 * @param input
20 * 通过firebug获取请求url
21 *
23 * @return
24 */
25 public static final String BAIDU_HOST = "http://unionsug.baidu.com";
26 public static final String QUERY_PATH = "/su?wd=";
27 public static final String PARAMETER = "&cb=window.bdsug.sug&from=superpage&t=";
28 public static final String REFERER_HEADER = "Referer";
29 public static final String REFERER = "http://www.baidu.com/";
30 public static final String BAIDU_SUG_REG = "\"[\\s\\S]*?\"";
31 private InputStream in = null;
32 private InputStreamReader inr = null;
33 private HttpURLConnection conn = null;
34
35 public JSONArray getBaiduRelateWord(String input) {
36 String t = String.valueOf(System.currentTimeMillis());
37 String response = null;
38 List<BaiduSuggestionUtil> list &#61; new ArrayList<BaiduSuggestionUtil>();
39 try {
40 URL url &#61; new URL(BAIDU_HOST &#43; QUERY_PATH
41 &#43; URLEncoder.encode(input, "utf-8") &#43; PARAMETER &#43; t);
42 conn &#61; (HttpURLConnection) url.openConnection();
43 conn.setRequestProperty(REFERER_HEADER, REFERER);
44 in &#61; conn.getInputStream();
45 inr &#61; new InputStreamReader(in, "gbk");
46 int c &#61; 0;
47 StringBuffer sb &#61; new StringBuffer();
48 while ((c &#61; inr.read()) !&#61; -1) {
49 sb.append((char) c);
50 }
51 response &#61; sb.toString();
52 Pattern pattern &#61; Pattern.compile(BAIDU_SUG_REG);
53 Matcher m &#61; pattern.matcher(response);
54 while (m.find()) {
55 BaiduSuggestionUtil bd &#61; new BaiduSuggestionUtil();
56 bd.setName(m.group().replace("\"", ""));
57 if(!bd.getName().equals(input)){
58 list.add(bd);
59 System.out.println(m.group().replace("\"", ""));
60 }
61 }
62 } catch (MalformedURLException e) {
63 e.printStackTrace();
64 return null;
65 } catch (UnsupportedEncodingException e) {
66 e.printStackTrace();
67 return null;
68 } catch (IOException e) {
69 e.printStackTrace();
70 return null;
71 } finally {
72 try {
73 if (inr !&#61; null) {
74 inr.close();
75 }
76 if (in !&#61; null) {
77 in.close();
78 }
79 } catch (IOException e) {
80 e.printStackTrace();
81 return null;
82 }
83 }
84 JSONArray jsonArray &#61; JSONArray.fromObject(list);
85 return jsonArray;
86 }
87 public static void main(String args[]){
88 new BaiduSuggestionUtil().getBaiduRelateWord("zhongqiu");
89 }
90 /**
91 * 百度联想词
92 */
93 private String name;
94
95 public String getName() {
96 return name;
97 }
98
99 public void setName(String name) {
100 this.name &#61; name;
101 }
102 }

  用工具类返回一个json格式数据&#xff0c;然后再action中调用这个json就行了。

下面是action中代码

public String findSuggestioName(){
JSONArray jsonArray
&#61; baiduSuggestionUtil.getBaiduRelateWord(name);
String result
&#61; jsonArray.toString();
getResponse().setContentType(
"text/json;charset&#61;UTF-8");
try {
getResponse().getWriter().write(result);
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}

 这是demo baidu.jsp

1 <HEAD>
2 <base target&#61;"_self">
3 <meta http-equiv&#61;"pragma" content&#61;"no-cache">
4 <meta http-equiv&#61;"cache-control" content&#61;"no-cache">
5 <meta http-equiv&#61;"expires" content&#61;"0">
6 <meta http-equiv&#61;"Content-Type" content&#61;"text/html; charset&#61;utf-8" />
7 <TITLE>百度联想词TITLE>
8 <link rel&#61;"icon" href&#61;"<%&#61;request.getContextPath()%>/favicon.ico" type&#61;"image/x-icon" />
9 <link rel&#61;"shortcut icon" href&#61;"<%&#61;request.getContextPath()%>/favicon.ico" type&#61;"image/x-icon" />
10 <link rel&#61;"stylesheet" type&#61;"text/css" href&#61;"<%&#61;request.getContextPath()%>/pages/js/autocomplete/jquery.autocomplete.css"/>
11 <script type&#61;"text/Javascript" src&#61;"<%&#61;request.getContextPath()%>/pub/js/jquery-1.4.2.min.js">script>
12 <script type&#61;"text/Javascript" src&#61;"<%&#61;request.getContextPath()%>/pages/js/autocomplete/jquery.autocomplete.js">script>
13 <script>
14 $(document).ready(function() {
15 $("#suggestionName").autocomplete(&#39;<%&#61;request.getContextPath() %>/findSuggestioName.action&#39;, {
16 matchContains: true,
17 minChars: 1,
18 extraParams: {name:function(){return $(&#39;#suggestionName&#39;).val();}},
19 dataType: "json",
20 mustMatch:false,
21 parse: function(data) {
22 return $.map(data, function(row) {
23 return {
24 data: row,
25 value: row.name,
26 result: row.name
27 }
28 });
29 },
30 formatItem: function(item) {
31 return item.name;
32 }
33 }).result(function(e, item) {
34 });
35 });
36
37 script>
38 HEAD>
39 <BODY>
40 <form name&#61;"siteform" action&#61;"" method&#61;"post" id&#61;"siteform">
41 <table width&#61;"100%" height&#61;"500" border&#61;"0" cellpadding&#61;"0" cellspacing&#61;"0">
42 <tr>
43 <td width&#61;"973" height&#61;"500" valign&#61;"top"><table border&#61;"0" cellpadding&#61;"0" cellspacing&#61;"0" class&#61;"section-content">
44
45 <tr>
46 <td valign&#61;"top"><table border&#61;0 align&#61;"center" cellpadding&#61;2 cellspacing&#61;1>
47 <TBODY>
48
49
50 <TR>
51 <TD align&#61;"right">百度联想词&#xff1a;TD>
52 <TD><input type&#61;"text" name&#61;"suggestionName" id&#61;"suggestionName"/>
53 TD>
54 TR>
55
56 TBODY>
57 TABLE>td>
58 tr>
59 table> td>
60 tr>
61 table>
62 form>
63 BODY>
64 HTML>

  需要用到的jar包&#xff0c;第一次来博客园,不知道怎么上传文件&#xff08;智商啊&#xff01;&#xff01;&#xff01;&#xff09;&#xff0c;就贴个图片吧&#xff01;

 

ps:jquery-autocomplete对支持火狐有点问题&#xff0c;就是在中文输入法中&#xff0c;需要多按一次键才有提示效果&#xff0c;这个bug已经解决,网上有就不贴了。

还有就是当你选中下拉列表某一行时&#xff0c;文本框不会显示你选中的那一行&#xff0c;这是jquery-autocomplete 一个bug&#xff0c;已经调好

解决办法:

只要在jquery.autocomplete.js moveSelect(step)方法第333行处添加一行代码即可

 input.value&#61;activeItem.text();

这是添加前的代码

1 function moveSelect(step) {
2 listItems.slice(active, active &#43; 1).removeClass(CLASSES.ACTIVE);
3 movePosition(step);
4 var activeItem &#61; listItems.slice(active, active &#43; 1).addClass(CLASSES.ACTIVE);
5 if(options.scroll) {
6 var offset &#61; 0;
7 listItems.slice(0, active).each(function() {
8 offset &#43;&#61; this.offsetHeight;
9 });
10 if((offset &#43; activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
11 list.scrollTop(offset &#43; activeItem[0].offsetHeight - list.innerHeight());
12 } else if(offset < list.scrollTop()) {
13 list.scrollTop(offset);
14 }
15 }
16 };

这是添加后的代码

1 function moveSelect(step) {
2 listItems.slice(active, active &#43; 1).removeClass(CLASSES.ACTIVE);
3 movePosition(step);
4 var activeItem &#61; listItems.slice(active, active &#43; 1).addClass(CLASSES.ACTIVE);
5 input.value&#61;activeItem.text();
6 if(options.scroll) {
7 var offset &#61; 0;
8 listItems.slice(0, active).each(function() {
9 offset &#43;&#61; this.offsetHeight;
10 });
11 if((offset &#43; activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
12 list.scrollTop(offset &#43; activeItem[0].offsetHeight - list.innerHeight());
13 } else if(offset < list.scrollTop()) {
14 list.scrollTop(offset);
15 }
16 }
17 };

这是最终的demo效果。选中某一行&#xff0c;文本框随之变化。

第一次写blog&#xff0c;记录下&#xff0c;坚持&#xff01;

 

 

 

 

 

转:https://www.cnblogs.com/montya/archive/2011/09/04/baidu.html



推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了在CentOS 7.x上进行端口映射配置的方法,通过修改内核和配置防火墙实现端口映射。作者分享了自己使用华为服务器进行端口映射的经验,发现网速比直连还快且稳定。详细的配置过程包括开启系统路由模式功能、设置IP地址伪装、设置端口映射等。同时,还介绍了如何监听本地端口的tcp请求,以及删除规则和开放的端口的方法。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
汪健宜婉瑜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有