在项目中加上第三方搜索

在django项目中加上第三方(bing)搜索

搜索,是一个网站基本的能力。在这个例子中,我们添加了搜索功能,其原理是:

1. 注册Bing search API

1.1 注册marketplace

首先需要注册一个Microsoft Azure Marketplace的账号。可以通过Hotmail账号注册 (注意语言需要使用英文。用中文的话,微软是不会提供API的)。

1.2 Sign Up应用

然后是在这个应用商店中找到应用,如链接:[https://datamarket.azure.com/dataset/bing/search]。微软的搜索引擎按照transaction per month来算的,我们就注册一个5000TPS的即可。
(img)(img)
注册完成之后,还需要找到API key,最好是新建一个API key,这个key会在后面调用的时候使用。

2. 调用Bing Search API

后面的这几部都是代码实现的。

2.1 根据API文档配置参数

目前我们先创建一个bing_search.py的文件。然后需要参考微软的API文档,看看这个是怎么调用的。
从[https://datamarket.azure.com/dataset/bing/search#schema]可以找到service_root_url,然后这个作为一个root。
然后查阅《Bing Search API Quick Start and Code Samples》文件,上面有列举the examples of your final URI to the Bing Search API:
https://api.datamarket.azure.com/Bing/Search/Web?$format=json&Query=%27Xbox%27

根据这个,我们定义了几个参数,传入到search_url中:
'' search_url = "{0}{1}?$format=json&$top={2}&$skip={3}&Query={4}".format(
'' root_url,
'' source,
'' results_per_page,
'' offset,
'' query
'' )

2.2 通过password_manager来管理密码:

'' password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
'' password_mgr.add_password(None, search_url, username, BING_API_KEY)

3. 将数据存入result列表中

3.1 urllib.request.urlopen()的解码处理

这里我们使用的url open得到的response,而url open返回的是一个binary的文件,son又zhi只接受utf-8格式的,所以这里需要将接收到的文件decode为utf-8格式.然后再在json.loads。

'' # Convert the bytes to a str. Because "The JSON object must be str, not 'bytes'"
'' str_response = response.decode('utf-8')
''
'' # Convert the string response to a Python dictionary object.
'' json_response = json.loads(str_response)

3.2 如何将json对应到python列表中

下面第一句的数组是对JSON的标准处理。关于json的知识,可以参考这篇文章[link]。简单来说,JSON就是一个标准化的数组格式
'' for result in json_response['d']['results']:
'' results.append({
'' 'title': result['Title'],
'' 'link': result['Url'],
'' 'summary': result['Description']
'' })
如果在PHP中,也是通过类似的方法:
''foreach($jsonObj->d->results as $value)
''

3.3 通过命令行的形式验证

在实施网页版本之前,首先通过命令行的形式保证这个API可以Working。
具体请见代码

4. 展示result

需要在Template中添加相应的search.html
需要在views中添加search(request)的view。
需要在urls.py中添加url
最后在base上添加链接。

5. 代码

'' import json
'' import urllib.request
'' import urllib.parse
'' from rango.keys import BING_API_KEY
''
''
''
'' def run_query(search_terms):
'' # Specify the base
'' root_url = 'https://api.datamarket.azure.com/Bing/Search/v1/'
'' source = 'Web'
''
'' # Specify how many results we wish to return per page
'' results_per_page = 10
'' offset = 0
''
'' # Warp quotes around our query terms as required by the Bing API
'' query = "'{0}'".format(search_terms)
'' query = urllib.request.quote(query)
''
'' # Constructs the latter part of our request's URL
'' search_url = "{0}{1}?$format=json&$top={2}&$skip={3}&Query={4}".format(
'' root_url,
'' source,
'' results_per_page,
'' offset,
'' query
'' )
''
'' # Setup authentication with the Bing servers.
'' # The username MUST be a blank string, and put in your API key!
'' username = ''
''
'' # Create a 'password manager' which handles authentication for us.
'' password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
'' password_mgr.add_password(None, search_url, username, BING_API_KEY)
''
'' # Create our results list which we'll populate
'' results = []
''
'' try:
'' # Prepare for connecting to Bing's servers.
'' handler = urllib.request.HTTPBasicAuthHandler(password_mgr)
'' opener = urllib.request.build_opener(handler)
'' urllib.request.install_opener(opener)
''
'' # Connect to the server and read the response generated.
'' response = urllib.request.urlopen(search_url).read()
''
'' # Convert the bytes to a str. Because "The JSON object must be str, not 'bytes'"
'' str_response = response.decode('utf-8')
''
'' # Convert the string response to a Python dictionary object.
'' json_response = json.loads(str_response)
''
'' # Loop through each page returned, populating out results list.
'' for result in json_response['d']['results']:
'' results.append({
'' 'title': result['Title'],
'' 'link': result['Url'],
'' 'summary': result['Description']
'' })
'' except urllib.request.URLError as e:
'' # Catch a URLError exception - something went wrong when connecting
'' print("Error when querying the Bing API: "+e)
''
'' return results
''
'' def main():
'' search_terms = input("Input the word you want to search>> ")
'' results = run_query(search_terms)
'' print("Rank"+' '+'Title'+50*' '+'URL')
'' rank = 0
'' for result in results:
'' rank += 1
'' print(str(rank).ljust(5), end=' ')
'' print(result['title'].ljust(50), end=' ')
'' print(result['link'])
''
'' if name == 'main':
'' main()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 80,787评论 1 177
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 27,973评论 1 144
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 32,520评论 0 104
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 17,633评论 0 90
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 22,928评论 0 146
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 18,886评论 1 87
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 11,602评论 2 164
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 11,004评论 0 80
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 9,555评论 5 114
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 12,774评论 0 130
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 11,540评论 1 127
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 12,369评论 0 132
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 7,166评论 0 18
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 9,970评论 2 119
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 13,147评论 3 128
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 8,784评论 0 3
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 9,019评论 0 78
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 13,676评论 2 137
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 14,201评论 2 134

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 133,313评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,081评论 4 58
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    香橙柚子阅读 21,770评论 8 183
  • 还记得小时候听的那首童年的歌谣吗? 池塘边的榕树上,知了在声声叫着夏天,操场边的秋千声上 ,只有蝴蝶停在上面,黑板...
    东方小豆子阅读 302评论 1 1
  • 美食一:闫家驴肉火烧 来到大保定,心心念念要吃一顿大保定早餐标配,闫家驴肉火烧,小菜和粥免费自取,嗜...
    孟琳漫步人生路阅读 181评论 5 3