终于,Python 也可以写前端了
有一个问个如何快速搭建一个搜索引擎,在搜索之后我看到了这个

# 代码所在
官方服务非常贴心;得益于提供了一个便捷的Docker镜像;通过简单的pull操作即可快速上手;并执行相应的操作指令。
cid=$(sudo docker ps -a | grep searx | awk '{print $1}')echo searx cid is $cidif [ "$cid" != "" ];then sudo docker stop $cid sudo docker rm $cidfisudo docker run -d --name searx -e IMAGE_PROXY=True -e BASE_URL=http://yourdomain.com -p 7777:8888 wonderfall/searx
然后就可以使用了,正常查看docker的状态,就可以正常的使用了
# 思考
怎么样,是不是很方便,我们先看看源码是怎么样实现的

当我们查看其中的代码时,其实其核心功能是整合请求后的数据成果.其数据来源可能来自数据库或文件,并可通过进一步分析深入查看其核心逻辑.
from urllib import urlencode
from json import loads
from collections import Iterable
search_url 初始化为None;
url_query 设为None;
content_query 赋值为空字符串;
title_query 初始为None;
suggestion_query 赋值为空字符串;
results_query 赋值为空字符串。
parameters for engines with paging support
number of results on each page
(only needed if the site requires not a page number, but an offset)
page_size = 1
number of the first page (usually 0 or 1)
first_page_num = 1
def iterate(iterable):
if type(iterable) == dict:
it = iterable.iteritems()
else:
it = enumerate(iterable)
for index, value in it:
yield str(index), value
def is_iterable(obj):
if isinstance(obj, str):
return False
elif isinstance(obj, unicode):
return False
else:
return isinstance(obj, Iterable)
def parse(query):
q = []
for parts in query.split('/'):
if not parts:
continue
else:
q.append(parts)
return q
def do_query(data, q):
ret = []
if not q:
return ret
qkey = q[0]
for key, value in iterate(data):
当q的长度等于1时:
如果键与qkey相等:
将value添加到返回结果列表中
否则(如果value是可迭代对象):
将do_query的结果扩展到返回结果中
否则(即当上述条件不满足时):
如果value不是可迭代对象:
继续循环当前层的处理
如果键与qkey一致:
将do_query的结果扩展到返回结果中,并排除第一个元素
最终返回值列表
def query(data, query_string):
q = parse(query_string)
return do_query(data, q)
def request(query, params):
query = urlencode({‘q’: query})[2:]
将fp字典的'query'字段赋值为query变量。
只有当paging存在且search_url中包含'{paged_no}'时才执行后续操作。
fp字典中的'paged_no'字段被赋值为(params['paged_no']减一乘以page_size)再加上first_page_num。
params[‘url’] = search_url.format(**fp)
params[‘query’] = query
return params
响应函数response接收到resp参数。该函数初始化一个空的结果列表,并将响应文本解析为JSON数据。如果存在结果查询条件,则遍历JSON数据中的每个结果项。对于每一个结果项,分别获取其URL信息、标题信息以及内容信息,并将这些信息整合到结果列表中。否则情况:依次处理各个字段的数据项。
if not (suggestion_query is None):
break
for suggestion in query(json, suggestion_query):
results.append({'suggestion': suggestion})
return results
# 结果
每当处理一个response时, 我们都需要提供一种自定义返回数据的方式(可选包括来自网络、数据库或文件)。那么, 如果我们可以hacking响应结果, 那么就可以将收集到的数据作为返回结果使用。比如像1024这样的数值, 完全有可能打造属于自己的"兴趣"小引擎。具体的代码实现部分这里不做详细展示, 鼓励大家自行尝试并探索更多可能性。通过结合jieba进行分词处理, 能够带来更多有趣的功能和应用
每当处理一个response时, 我们都需要提供一种自定义返回数据的方式(可选包括来自网络、数据库或文件)。那么, 如果我们可以hacking响应结果, 那么就可以将收集到的数据作为返回结果使用。比如像1024这样的数值, 完全有可能打造属于自己的"兴趣"小引擎。具体的代码实现部分这里不做详细展示, 鼓励大家自行尝试并探索更多可能性。通过结合jieba进行分词处理, 能够带来更多有趣的功能和应用
往期推荐文章:
