使用 .NET 的必应搜索 API 基础知识






4.92/5 (35投票s)
本文将使您能够使用 Bing 搜索 API 为您的应用程序添加自定义搜索规则,以及更多功能。
目录
引言
互联网是我们今天如此依赖的世界。互联网是我们生活中最重要的部分之一。互联网的核心在于搜索引擎。我们大多数人使用互联网只是为了获取未知的信息。为了获取知识,我们使用搜索引擎。搜索引擎使用网络爬虫功能从各种网站收集信息并将其提供给我们。当我们想到互联网时,第一个想到的词就是谷歌。谷歌是最著名的搜索引擎,几乎拥有一个人可能想到的所有答案。
微软也有搜索引擎,但它们从未能与谷歌的卓越相媲美。因此,在过去的几十年里,谷歌一直是全世界主要的搜索引擎,直到今年微软首次推出了必应。必应是一个智能搜索引擎,它像爬虫一样收集一切,但它会优先排序最相关的项目,这样用户就可以花费更少的时间来获取他们需要的最有价值的信息。您可以通过以下链接找到必应最近推出的所有功能:
必应的重要功能 [^]
必应还为开发者提供了一项卓越的服务。它鼓励开发者在自己的应用程序中使用其搜索 API。我将在本文中讨论必应搜索 API。文章包含一个示例应用程序,但由于我是 WPF 的新手,我已将其制作得尽可能简单。
特点
必应 API 为开发者提供了构建能够实现以下功能的应用程序的途径:
- 在需要时从搜索引擎检索有价值的信息。
- 即时获得问题的答案
- 为用户检索电话号码。
- 通过广告实现应用程序盈利。
- 添加即时新闻文章等等
如何在您的应用程序中使用必应 API
必应 API 提供三种协议供您在请求中使用
- 基于 JSON 的方法
- 基于 XML 的方法
- 基于 SOAP 的方法
- 打开您的浏览器,指向 必应开发者中心
- 进入页面后,按照页面下方所示的“登录”链接。
- 使用您的 Live ID 登录。(如果您还没有,则需要创建一个新的)
- 现在,填写表单以注册您的应用程序密钥,如上图所示。
- 最后,您将在列表中看到您注册的密钥。
该密钥必须用于每次请求服务才能正确工作。现在我将逐一讨论每种协议,同时我们的主要关注点是使用 SOAP 构建应用程序。我将提供其他协议的一些基本示例,让您对其有所了解。
源类型
必应提供许多源类型。让我们来看看它们:源类型 | 描述 |
---|---|
WEB | 此源类型搜索查询字符串,并根据其内置的自动化排名算法为您提供可用爬取结果的列表。这代表了必应服务的基本搜索算法。 |
IMAGE | 返回与查询相关的图像列表。 |
VIDEO | 返回搜索查询的视频结果列表 |
AD | 返回与查询相关的广告链接 |
新闻 | 基于当前查询的、根据传递的地点(如果适用)的新闻条目。 |
RELATEDSEARCH | 一项独特的功能,使必应服务能够自动确定与当前搜索相关的搜索并显示结果。 |
SPELL | 拼写功能可根据其数据库自动确定查询中单词的正确拼写。 |
TRANSLATE | 它根据指定的目标语言 ID,将传递给必应服务的最多三个句子从一种语言翻译成另一种语言。 |
INSTANTANSWER | 这是另一项独特功能,可让您从当前查询中获得即时答案。它会为您的问题提供权威性答案。 |
PHONEBOOK | 正如您所想象的,它会搜索电话号码。这是必应服务的另一项出色功能。 |
MOBILEWEB | 为移动浏览器返回精简的输出。 |
基于 JSON 的方法
基于 JSON(JavaScript 对象表示法)的方法是最简化的方法,其中仅通过适当的 URL 向服务器发出请求。我们创建一个包含 ApplicationId、Search Criteria、Nos of Offset 等的字符串,然后相应地连接服务器。服务器将返回一个 JSON 字符串作为响应。当我们需要 AJAX 调用服务器且没有服务器端处理选项时,此方法很有用。
要使用 JSON 方法调用请求,我们通过以下 URL 连接服务器: http://api.search.live.net/json.aspx
需要注意的是,每次调用服务器都需要传递一些参数。
- 所有源类型共有的必需属性
- AppId:这是必需字段,必须放在每个请求的查询字符串中。AppId 的值可以在注册 必应 SDK 后找到。
- Query:此字段表示将生成结果的主要搜索字符串。这也是一个必填字段。
- Sources:它指示在查询字符串中指定字符串的位置。这也是生成输出的必填条件。SourceType 通常有多种类型,将在后续部分详细讨论。
- 所有源类型共有的可选参数
- Version:这指示应使用哪个版本的必应 API 来生成搜索输出。我们需要在此指定 2.0,因为当前版本是 2.0。如果您需要使用任何其他版本,则需要相应地更改您的程序。此字段是可选的。
- Market:用于指定可能用于过滤搜索项的区域设置。值应为有效的区域设置字符串(例如,en-Us、fr-Fr、hi-In 等)。
- Adult:它指示搜索时应显示多少成人内容。默认值为“Moderated”(已审核)。
- Options:有一些选项可指示是否需要突出显示搜索字符串。我们使用 **EnableHighlighting** 来确保搜索字符串在结果中突出显示。我们还可以使用 **DisableLocationDetection** 来禁用当前搜索条件的位置搜索。
- 特定于源类型的参数,源类型: **WEB**
- Web.Count:这表示调用搜索时要返回的结果数。
- Web.Offset:指定在选择结果之前必须跳过的结果数。例如,如果我们想要起始元素,则传递偏移量为 0。
- Web.Options:有两个选项可用于自定义输出。**DisableHostCollapsing** 指示是否列出不可用的主机。**DisableQueryAlterations** 指示在 Web 数据更改时是否会更改查询。
- 特定于源类型的参数,源类型: **IMAGE**
- Image.Count:表示要返回的图像结果的数量。
- Image.Offset:要跳过的图像数量。
- 特定于源类型的参数,源类型: **AD**
- Ad.MlAdCount:表示单次搜索中需要显示的头条广告数量。
- Ad.SbAdCount:表示侧边栏广告数量。
- Ad.ChannelId:广告的频道标识符,以便将合适的广告展示给合适的应用程序。
- 特定于源类型的参数,源类型: **PhoneBook**
- Phonebook.FileType:这是要搜索号码的文件类型。它有两个值:`YP(商业)` / `WP(住宅)`。
- Phonebook.SortBy:号码排序。
- 特定于源类型的参数,源类型: **News**
- News.LocationOverride:表示新闻文章应在哪里的位置。
- News.Category:要过滤的新闻类别。
- News.SortBy:排序元素。
- 特定于源类型的参数,源类型: **Translate**
- Translation.SourceLanguage:翻译操作期间源语言的代码。
- Translation.TargetLanguage:翻译操作期间目标语言的代码。
因此,我们的 JSON 搜索调用将如下所示:
http://api.bing.net/json.aspx?AppId=YOUR_APPID&Version=2.0&Market=en-US&Query=abhishek+sur&Sources=web+spell&Web.Count=1
如果我们查看 JSON 响应字符串,它将如下所示:
{ "SearchResponse":{ "Version":"2.0", "Query":{ "SearchTerms":"abhishek sur" }, "Web":{ "Total":48800, "Offset":0, "Results":[ {"Title":"CodeProject: Member Profile: Abhishek Sur. Free source code and ...", "Description":"Member Profile: Abhishek Sur - Free source code and tutorials for Software developers and Architects.", "Url":"http:\/\/www.codeproject.com\/script\/Membership\/View.aspx?mid=4293807", "DisplayUrl":"www.codeproject.com\/script\/Membership \/View.aspx?mid=4293807", "DateTime":"2009-10-28T17:49:30Z" }] } } }因此,我们可以看到,如果您将 `YOUR_APPID` 替换为您的相应 ID 并在浏览器中运行此 URL,您将看到我的 Codeproject 个人资料。
现在让我们看一下完整的代码:
var qry = 'abhishek sur'; var src= 'Web'; function Search() { var requestStr = "http://api.search.live.net/json.aspx?" + "AppId=" + AppId + "&Query=" + qry + "&Sources=" + src + "&Version=2.0" + "&Market=en-us" + "&Adult=Moderate" + "&Web.Count=10" + "&Web.Offset=0" + "&Web.Options=DisableHostCollapsing+DisableQueryAlterations" // JSON-specific request fields (optional) + "&JsonType=callback" + "&JsonCallback=SearchCompleted"; var requestScript = document.createElement("script"); requestScript.type = "text/javascript"; requestScript.src = requestStr; var head = document.getElementsByTagName("head"); head[0].appendChild(requestScript); } function SearchCompleted(response) { var errors = response.SearchResponse.Errors; if (errors != null) { //load error.... } else { DisplayResults(response); } } function DisplayResults(response) { var output = document.getElementById("output"); var results = response.SearchResponse.Web.Results; var resultList = document.createElement("ul"); output.appendChild(resultList); // Display the results header. resultsHeader.innerHTML = "Web results for " + response.SearchResponse.Query.SearchTerms + " Displaying " + (response.SearchResponse.Web.Offset + 1)+ " to " + (response.SearchResponse.Web.Offset + results.length) + " of "+ response.SearchResponse.Web.Total + " results "; var resultsListItem = null; var resultStr = ""; for (var i = 0; i < results.length; ++i) { resultsListItem = document.createElement("li"); resultsList.appendChild(resultsListItem); resultStr = "%5C%22%22">" + results[i].Title + " " + results[i].Description + " Last Crawled: " + results[i].DateTime + " "; resultsListItem.innerHTML = resultStr; } }执行此代码后,它将创建搜索结果项的前 10 个列表,并使用 Ul/Li 在列表中显示它们。
基于 XML 的方法
我们可以使用基于 XML 的方法来为我们的应用程序使用必应服务。它会生成 HTTP GET 请求以获取当前查询语句的 XML 响应。如果我们使用的应用程序无法处理复杂的 SOAP 请求响应,我们可以将其作为一个选项。您只需在应用程序中创建一个 WebRequest 对象,并使用带有结果条件的查询字符串,然后从中获取响应 XML。
要调用 XML 请求,我们通过此 URL 连接服务器:
http://api.bing.net/xml.aspx
现在,正如我在 JSON 方法部分已经提到过的基本查询字符串属性,我将不再重复。让我们快速看一下查询字符串的样子:
http://api.bing.net/xml.aspx?AppId=YOUR_APPID&Version=2.2&Market=en-US&Query=abhishek+sur&Sources=web+spell&Web.Count=1
<?pageview_candidate ?> <SearchResponse Version="2.2"> <Query> <SearchTerms>abhishek sur</SearchTerms> </Query> <web:Web> <web:Total>48800</web:Total> <web:Offset>0</web:Offset> <web:Results> <web:WebResult> <web:Title> CodeProject: Member Profile: Abhishek Sur. Free source code and ... </web:Title> <web:Description> Member Profile: Abhishek Sur - Free source code and tutorials for Software developers and Architects. </web:Description> <web:Url> https://codeproject.org.cn/script/Membership/View.aspx?mid=4293807 </web:Url> <web:CacheUrl> http://cc.bingj.com/cache.aspx?q=abhishek+sur &d=4730799138997872&mkt=en-US&w=711d76ec,f208163f </web:CacheUrl> <web:DisplayUrl> www.codeproject.com/script/Membership/View.aspx?mid=4293807 </web:DisplayUrl> <web:DateTime>2009-10-28T17:49:30Z</web:DateTime> </web:WebResult> </web:Results> </web:Web> </SearchResponse>因此,我们可以轻松地在任何语言中解析此 WebResponse 对象并在应用程序中显示。如果您使用的是 .NET,则可以创建
string requestString = "http://api.bing.net/xml.aspx? AppId=YOUR_API&Version=2.2&Market=en-US&Query=abhishek+sur &Sources=web+spell&Web.Count=1"; HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestString); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); XmlDocument document = new XmlDocument(); document.Load(response.GetResponseStream()); // Now parse it....希望您自己可以解析 `XmlDocument`。您也可以使用 `XDocument` 而不是 `XmlDocument` 来利用响应中的 `LINQ`,并使工作更加轻松。
基于 SOAP 的方法
这是最复杂的方法,它消除了 XML 协议的 HTTP GET 请求的限制,并确保创建基于 SOAP 的请求对象,该对象通过 Post 请求发送,并通过 SOAP 协议接收响应。服务器上运行的服务基本上是一个 WCF 服务,它实现 BasicHttpBinding 以类似于普通 Web 服务的方式工作。此方法可以与 .NET 等高级技术一起使用。我将使用 .NET 来演示如何构建应用程序。
创建基于 SOAP 的 .NET 应用程序的步骤
- 打开 Visual Studio,创建一个新项目。您可以选择任何项目类型。在示例应用程序中,我使用了 WPF 应用程序。
- 为您的项目添加 Web 引用。您应该使用的路径是:
http://api.search.live.net/search.wsdl?AppID=YOUR_APPID
- 现在创建一个 `LiveSearchPortTypeClient` 对象,它是基本终结点类。让我们看看下面的代码:
public string SearchOutput(string AppId, string query, int offset, int no_of_res) { using (LiveSearchService service = new LiveSearchService()) { try { SearchRequest request = new SearchRequest(); request.AppId = AppId; request.Query = query; request.Sources = new SourceType[] { SourceType.Web }; //You may specify multiple request.Version = "2.0"; request.Market = "en-us"; request.Adult = AdultOption.Moderate; request.AdultSpecified = true; request.Web = new WebRequest(); request.Web.Count = no_of_res; request.Web.CountSpecified = true; request.Web.Offset = offset; SearchResponse response = service.Search(request); return GetResponsestring(response); } catch (Exception ex) { return ex.Message; } } }
在这里,我们调用对必应服务器的请求并获取响应。响应对象将保存当前搜索的结果集。 - 我们可以传递 `Offset`(表示当前搜索的跳过元素,0 表示从第一个开始显示)和 `Count`(表示要获取的结果数)来获取所需的结果。

结果对象中可能有用的一些属性
有几个属性在生成所需的搜索结果时可能非常有用。我将在这里讨论其中的一些:
WebResult.Title
:指定结果字符串的标题元素。WebResult.Description
:链接的简短描述。WebResult.Url
:指向当前结果的 URL。ImageResult.MediaUrl
:返回指向完整尺寸图像的 URL。ImageResult.ContentType
:这是结果中图像的 Mime 类型。ImageResult.Thumbnail.Url
:表示对应于结果缩略图尺寸图像的 URL。InstantAnswerResult.ClickThroughUrl
:表示包含查询答案的必应 URL。NewsResult.BreakingNews
:标识新闻是否为突发新闻。1 表示“突发新闻”,0 表示不是。TranslationResult.TranslatedTerm
:返回源指定的翻译字符串结果。
参考
http://msdn.microsoft.com/en-us/library/dd251020.aspx [^]关注点
在此应用程序中,我添加了一个示例应用程序。该应用程序是使用 WPF 编写的。我现在只添加了普通的 Web 搜索。稍后我将添加其他 SourceType 选项。
另外请注意,我是 WPF 新手,所以在示例应用程序的这个版本中,您可能对外观和感觉不满意。我稍后会用更高级的示例应用程序进行更新。
您可以在此处找到示例应用程序的第一版:下载 SearchAPISample.zip - 200.46 KB
历史
初始发布:2009 年 11 月 31 日