使用Google Web API (Web Service) 构建本站搜索
1. Google发布了一些API,用于向用户提供客户化的搜索.在自己的程序中,使用Google搜索服务,构建自己的搜索.
Google WEB API符合SOAP和WSDL标准,它使用XML的方式返回结果,因此你可以自定义返回的结果显示方式,也可以方便的存储这些数据。
2. 使用Google Web API 步骤
2.1 注册Google帐号,获取license key. 才可用调用API.
如何获取license key 参见: http://www.google.com/apis/index.html
注: WebAPI 对用户的搜索有限制,每天1000次.
2.2 在自己的程序中添加对API的web引用.
2.3 调用API中的方法,获取搜索结果
google的web服务就提供了三种方法:
doGoogleSearch(), doGetCachedPage(), 和doSpellingSuggestion().
doGoogleSearch()这个方法将返回和你输入的查询字符相符合的结果。然后这个方法返回一个GoogleSearchResult类的实例,这个实例中包含了搜索的结果。
要指定搜索某一个网站的信息,在搜索关键字后面加 site:网站地址 .
3. 问题
使用Google发布的WebAPI可以方便的实现自己站内的搜索.但有个问题是,你的网站在google中起码有个排名,也就是说你的网站要被google抓到,并且将你的网页存到它的知识库里.你才能从它的web api 中获取到对自己站内的搜索结果.
4. 自己做的例子(包括一个页面Search.aspx,和cs文件Search.aspx.cs)
4.1 Search.aspx文件代码
<form method="post" runat="server">
<table style="Z-INDEX: 101; LEFT: 24px; POSITION: absolute; TOP: 24px" width="1000" bgColor="#ffffff">
<tr>
<td colSpan="3"><A><IMG src="img/search.gif" border="0"></A>
<asp:textbox id="txb_query" runat="server"></asp:textbox>
<asp:button id="btn_Go" runat="server" Text="搜索"></asp:button>
<asp:CheckBox id="cbx_site" runat="server" Text="搜索本站"></asp:CheckBox>
每天限制1000次
</td>
</tr>
<TR>
<TD bgColor="#ccccff" colSpan="3"><FONT face="宋体"></FONT></TD>
</TR>
<TR>
<TD style="HEIGHT: 21px" colSpan="3"><FONT face="宋体">共[
<asp:label id="lab_total" runat="server" Width="8px">0</asp:label>]条|</FONT><FONT face="宋体">搜索时间[
<asp:label id="lab_time" runat="server" Width="8px">0</asp:label>]秒
<asp:HyperLink id="HyperLink1" runat="server" NavigateUrl="/maxsoft/Default.aspx">返回主页</asp:HyperLink></FONT><FONT face="宋体"></FONT></TD>
</TR>
<TR>
<TD bgColor="#ccccff" colSpan="3"><FONT face="宋体"></FONT><FONT face="宋体"></FONT><FONT face="宋体"></FONT></TD>
</TR>
<TR>
<TD colSpan="3"><FONT face="宋体"></FONT><FONT face="宋体"></FONT><FONT face="宋体"><asp:placeholder id="PlaceHolder1" runat="server"></asp:placeholder></FONT></TD>
</TR>
<TR>
<TD align="center" colSpan="3"><FONT face="宋体"><asp:linkbutton id="lbt_previous" runat="server">上一页</asp:linkbutton> 第
<asp:label id="lab_currentPage" runat="server">0</asp:label>/
<asp:label id="lab_totalPage" runat="server">0</asp:label>页
<asp:LinkButton id="lbt_next" runat="server">下一页</asp:LinkButton></FONT></TD>
</TR>
</table>
</form>
4.2 Search.aspx.cs文件代码
4.2.1 定义变量
private static int currentPage = 0;//当前页数
private static int pageSize = 10;//每页多少条
private static int totalPages = 0;//总页数
private static int totalCount = 0;//总条数.
private static string queryString = "";
private static string restrictSite = "www.sharptask.com/maxsoft";
4.2.2 搜索按钮代码
private void btn_Go_Click(object sender, System.EventArgs e)
{
this.InitializeVariable();
this.GoSearch(pageSize,currentPage,this.txb_query.Text,restrictSite);
}
4.2.3 上一页 按钮
private void lbt_previous_Click(object sender, System.EventArgs e)
{
if(currentPage > 0)
--currentPage;
this.GoSearch(pageSize,currentPage,queryString,restrictSite);
}
4.2.4 下一页 按钮
private void lbt_next_Click(object sender, System.EventArgs e)
{
++ currentPage;
this.GoSearch(pageSize,currentPage,queryString,restrictSite);
}
4.2.5 其他自定义方法
/// <summary>
/// 初始化变量值
/// </summary>
private void InitializeVariable()
{
currentPage = 0;
totalPages = 0;
totalCount = 0;
queryString = "";
}
/// <summary>
/// 调用Google WEB API
/// </summary>
/// <param name="pageSize"></param>
/// <param name="currentPage"></param>
/// <param name="queryString">搜索条件</param>
/// <param name="restrictSite">搜索站点</param>
private void GoSearch(int pageSize,int currentPage,string queryString,string restrictSite)
{
Google.GoogleSearchService g = new maxsoft.Google.GoogleSearchService();
try
{
// Invoke the search method
Google.GoogleSearchResult r = g.doGoogleSearch(
"UsM/hRhQFHJiJj3cDXQ8sMbxPUZOpBYH",
(this.cbx_site.Checked ? queryString+" site:"+restrictSite : queryString),
this.GetCurrentPageStartIndex(), pageSize,
false,
"",
false, "lang_zh-CN", "", "");
// Extract the numbers of results
GetResultNumbers(r);
//Bind element
this.BindElement(r);
}
catch (System.Web.Services.Protocols.SoapException ex)
{
Response.Write(ex.Message);
}
}
/// <summary>
/// 计算点击按钮时要进入的页号.
/// </summary>
/// <returns></returns>
private int GetCurrentPageStartIndex()
{
return currentPage * pageSize;
}
/// <summary>
/// 计算总页数
/// </summary>
/// <returns></returns>
private int GetTotalPages()
{
return ((totalCount%pageSize) == 0 ? totalCount/pageSize :totalCount/pageSize +1);
}
/// <summary>
/// 获取搜索结果中的一些数,计算并显示到页面
/// </summary>
/// <param name="r"></param>
private void GetResultNumbers(Google.GoogleSearchResult r)
{
totalCount = r.estimatedTotalResultsCount ;
totalPages = GetTotalPages();
queryString = r.searchQuery;
//页面显示结果数据
this.lab_total.Text = totalCount.ToString();
this.lab_time.Text = r.searchTime.ToString();
this.lab_totalPage.Text = totalPages.ToString();
this.lab_currentPage.Text = (currentPage+1).ToString();
}