71

Serverless 实践系列(五):如何将搜索引擎去广告?

 4 years ago
source link: https://www.tuicool.com/articles/FV7vqaF
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

现在大部分搜索引擎都有付费推广的内容,我们经常在使用搜索引擎的时候,会被这些付费搜索的东西所干扰,例如,搜索在线编程这个词条:

UfiyUne.jpg!web

可以看到这个词条,在一页屏幕上面,前面几个结果都是推广,这其中大部分命中的关键词是“编程”,而不是在线编程,这就会扰乱我们视听,也会给我们带来很不友好的体验,那么我们是否可以通过云函数 SCF 来做一个简单的工具,来屏蔽掉这些广告呢?

回答是当然可以,本教程将会通过 SCF+COS 来实现一个简单的网页搜索小工具,至于为啥叫搜索小工具,而不是叫去广告搜索小工具,结尾的地方,再详细说。

寻找广告特点

在对列表页代码研究过程中,我们发现,非广告页代码有:

maANZvR.jpg!web

而推广内容,则没有这个内容,所以,可以通过正则化,或者 XPATH 等操作来对目标内容进行识别。

本地实验

本地爬虫编写

根据对页面分析,我们可以得到这样一组参数:

复制代码

ie=utf-8
pn=10
wd= 在线编程

这组参数中,ie 是控制编码格式,pn 是翻页(偏移量),wd 是搜索词汇,对代码编写如下:

复制代码

import urllib.request
import re
page = 1
args_pn = (page-1) * 10
url ="http://www.baidu.com/s?ie=utf-8&pn="+ str(args_pn) +"&wd="+ urllib.request.quote(" 在线编程 ")
req_attr = urllib.request.urlopen(url)
result_list = re.findall("data-tools='(.*?)'",req_attr.read().decode("utf-8"))
foreveinresult_list:
print(eve)

运行结果:

复制代码

{"title":" 代码在线运行 - 在线工具 ","url":"http://www.baidu.com/link?url=2rtPQM1Yb08uBDUY61IkU3Apr7xkDiP2_zsnZH00HyMsViwBfFR9LJAiXcjqD_EK"}
{"title":" 南邮编程在线 ","url":"http://www.baidu.com/link?url=f_VCURb1ZNe7nVgW3G7IiBBvKDGaeht8SB3hK93jEEddFAtpJC2SGzBoFTs1BLWd"}
{"title":" 在线编程 - 编程中国 ","url":"http://www.baidu.com/link?url=hnYcaMNhRhf5FZfV1vlE5SGS6GjUls4fluKKW52mMIAHwXJd1wey2mOdmtb13ldf"}
{"title":" 一个简单的在线集成编程工具 - Anycodes - 随时随地有创意, 随时...","url":"http://www.baidu.com/link?url=zMnTtD6cBS_3XT21FMSviS_mzF0T2daHAui6_XC7LAscng2KPt064eej0JqPgfBX"}
{"title":" 非常好用的在线编程网站 - yimisiyang - CSDN 博客 ","url":"http://www.baidu.com/link?url=57aywD0Q6WTnl7XKbIHuE7R_FT8mrDBMv8kdi_tomry-X1SrzMnjNVuobcIXjUVnR_ZQrRZQrTHv5uSgfZ-GdR5ud1WK9aOaAKTP-KhFr4e"}
{"title":" 十个在线编程网站 _360doc 个人图书馆 ","url":"http://www.baidu.com/link?url=ouVP_VD3EkdRLL-X2bjZNJTdFbVIJgt0jrZL3II0hxj5yT3aTAo56tUA0hUfrCbiZKWcmBNTLKcTiwA7q1bxQJwxdZnKEUzChwQ_nefSJK3"}
{"title":"[转] 在线编程刷题网站 - gravely 的专栏 - CSDN 博客 ","url":"http://www.baidu.com/link?url=gPgyV9kX2IdYqfifVCn-22OPGWIZqBb3oGfRbl0b_LVRr0MmdgiXoaACk-vRZu6f45q3qsG4X3Zs2wexiex-0K"}
{"title":"c 在线编译器,c 语言在线解释器, 在线编程网站 ","url":"http://www.baidu.com/link?url=ETluxwW57CgsUIBR7-BKj0bLA65WJr2eipQ5rJOF-1AB3ymP4AGViYXC7AUCrUcW"}
{"title":"8 个国外最流行的在线编程练习网站 ","url":"http://www.baidu.com/link?url=3o0SRtHkYsI2gUjmjsks7dYk00VoljXmVhnkv-CskKh9aiaTAfyDPNa25f4Mj-7AcLrX9eiaObQVChuX5eG0BfWOcE1U-PGsVFWpCFLKSzq"}
{"title":" 在线编程 _ 百度百科 ","url":"http://www.baidu.com/link?url=0uxpDuoQDb_Amx9_6n9PqOpJr10tcRrbU0x-hshhnQNx2mVHyCiDJFsqthe-cEUQNv0AO0KFDYmCZP970sW8mVG02xwha-cNalwKUAogkmpwOQVy5xf9lqKdFROOMqBQ"}

可以看到,这个结果是第一页的搜索结果,他包括了:

首页结果,一对一匹配,并且没有上下的广告内容。证明本搜索结果是靠谱的。

搜索页面制作

因为我不是专业前端,就做一个非常简单的基础页面:

复制代码

<!DOCTYPE html>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title>新搜索 - Powered by Dfounderliu!</title>
</head>
<body>

<form>
请输入要搜索的内容:<inputtype="text"><br>
<inputtype="submit">
</form>
<divid="result">
<ol>
<li>结果 1</li>
<li>结果 2</li>
</ol>
</div>
</body>
</html>

效果大概这个样子:

QJJjQbq.png!web

发布服务

发布云函数服务

复制代码

# -*- coding: utf8 -*-
import json
import urllib.request
import re
def main_handler(event, context):
print(event["pathParameters"]["kw"])
print(event["pathParameters"]["pn"])
page = int(event["pathParameters"]["pn"])
args_pn = (page-1) *10
url ="http://www.baidu.com/s?ie=utf-8&pn="+ str(args_pn) +"&wd="+event["pathParameters"]["kw"]
req_attr = urllib.request.urlopen(url)
result_list = re.findall("data-tools='(.*?)'",req_attr.read().decode("utf-8"))
result =""
foreveinresult_list:
temp_json = json.loads(eve)
temp_result ='<li><a href="%s">%s</a></li>'%(temp_json["url"],temp_json["title"])
result = result + temp_result
returnresult

API 网关配置

qU7fQnv.png!web

API 测试

UrmAzyb.jpg!web

静态页面

接下来,对 HTML 页面进行修改,并且上传到 COS。

页面修改为:

复制代码

<!DOCTYPE html>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title>新搜索 - Powered by Dfounderliu!</title>
<scriptsrc="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script>
varUTFTranslate = {
Change:function(pValue){
returnpValue.replace(/[^\u0000-\u00FF]/g,function($0){
returnescape($0).replace(/(%u)(\w{4})/gi,"&#x$2;")
});
},
ReChange:function(pValue){
returnunescape(pValue.replace(/&#x/g,'%u').replace(/\\u/g,'%u').replace(/;/g,''));
}
};

functionsearchKw(){
varkw =document.getElementById("kw").value;
varpn =document.getElementById("pn").value;
$.get("http://service-rnwcbtai-1256773370.gz.apigw.tencentcs.com/release/list/"+ kw +"/"+ pn,function(data, status){
document.getElementById("result").innerHTML = UTFTranslate.ReChange(data)
});
}
</script>
</head>
<body>
<center><h1>在线搜索工具</h1></center>
<hr>
<center>
请输入要搜索的内容:<inputtype="text"id="kw"><br>
请输入要跳转的页面:<inputtype="text"id="pn"><br><br>
<buttontype="reset">重置</button>  |  <buttononclick="searchKw()">搜索</button>
</center>
<div>
<olid="result">
</ol>
</div>
</body>
</html>

在对象存储中新建存储桶,并上传刚才的 html 文件:

FRny2mM.png!web

修改权限为共有读,私有写:

Yveyqa3.png!web

基础配置,开启静态网站:

Mzi6veV.png!web

访问域名测试

viaqeei.jpg!web

总结

至此,我们完成了一个基本的去广告的搜索引擎,那么:

1、本分享主要目的何在

2、这个例子有什么价值

关于上面两个问题,简单回复:

本分享主要想告诉大家,有了云函数和 COS 以及 CDB 等产品,作为用户,可以暂时不用 CVM 了。静态网页,可以放在 COS 中,后端的处理,放在云函数,数据存储到 CDB,然后请求页面的时候,COS 为保证了基本的访问功能和足够的带宽,云函数提供了弹性伸缩的功能,让用户无需考虑流量多少,是否要对 CVM 扩容等。

这样一个过程,可以让我们将更多的精力放到 Coding 上,想一下,如果传统的一个 Python 程序员想要做这样一个网页,他需要哪些知识?需要 Django/flask 等基本框架知识,需要一些 Web 端的运维,例如怎么配置环境,怎么配置 Nginx 等操作,现在呢?不需要这些框架知识,你只需要做一个简单的 Html,Ajax 通信,然后,后端就是我们平常的一个爬虫,也不需要我们写那么多复杂的配置文件,我个人认为这就是一种进步,一种方便。

第二点,这个教程,表面上就是一个云函数运行一个爬虫,接入了 COS 的静态页面,让我们可以不用 CVM 也能做出一个网页,但是实际上,这个 DEMO 意义重大。首先,我只是简单的做了一个页面,完全可以将做一个目标页面预览功能,当你鼠标移动到对应的 URL 上面,会浮动出现目标网页的样子和你关键词命中的位置,这算不算搜索引擎中的一种创新?

除此之外,表面上这个是去掉了某一种搜索的广告,但是我们可以借此拓展,可将其他多家搜索数据进行一个整合,然后统一显示出来,这算不算是一种方便?或者,通过多个程序员常去的社区论坛,编写多个爬虫进行整个,实现一个程序员专员搜索?当然,这个只是本例子的一个应用场景,我写这个 Demo 的更大目的,是想给大家一个思路:原来做网站可以不用 CVM,直接用 COS+SCF+CDB 来搞定。

作者介绍:

刘宇,腾讯云 Serverless 团队后台研发工程师。毕业于浙江大学,先后参与腾讯云云函数产品研发、自动扩缩容、CLI 等模块建设以及社区相关工作。本文转载自微信公众号 ServerlessCloudNative(ID:ServerlessGo)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK