写点什么

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

2019 年 8 月 17 日

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

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



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


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


寻找广告特点

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



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


本地实验

本地爬虫编写

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


ie=utf-8pn=10wd=在线编程
复制代码


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


import urllib.requestimport repage = 1args_pn = (page-1) * 10url = "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"))for eve in result_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><html lang="en"><head>    <meta charset="UTF-8">    <title>新搜索 - Powered by Dfounderliu!</title></head><body>
<form> 请输入要搜索的内容:<input type="text"><br> <input type="submit"></form><div id="result"> <ol> <li>结果1</li> <li>结果2</li> </ol></div></body></html>
复制代码


效果大概这个样子:



发布服务

发布云函数服务

# -*- coding: utf8 -*-import jsonimport urllib.requestimport redef 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 = ""    for eve in result_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    return result
复制代码


API 网关配置


API 测试


静态页面

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


页面修改为:


<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>新搜索 - Powered by Dfounderliu!</title>    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>    <script>        var UTFTranslate = {            Change: function (pValue) {                return pValue.replace(/[^\u0000-\u00FF]/g, function ($0) {                    return escape($0).replace(/(%u)(\w{4})/gi, "&#x$2;")                });            },            ReChange: function (pValue) {                return unescape(pValue.replace(/&#x/g, '%u').replace(/\\u/g, '%u').replace(/;/g, ''));            }        };
function searchKw() { var kw = document.getElementById("kw").value; var pn = 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> 请输入要搜索的内容:<input type="text" id="kw"><br> 请输入要跳转的页面:<input type="text" id="pn"><br><br> <button type="reset">重置</button> &nbsp;&nbsp;|&nbsp;&nbsp;<button onclick="searchKw()">搜索</button></center><div> <ol id="result"> </ol></div></body></html>
复制代码


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



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



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



访问域名测试


总结

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


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)


《Serverless 实践系列(一):如何通过 SCF 与自然语言处理为网站赋能》


《Serverless 实践系列(二):为 Python 云函数打包依赖》


《Serverless 实践系列(三):突破传统 OJ 瓶颈,“判题姬”接入云函数》


《Serverless 实践系列(四):网站监控脚本的实现》


2019 年 8 月 17 日 10:007433

评论 1 条评论

发布
暂无评论
发现更多内容

如何帮助技术员工高效成长?这几家企业的做法值得借鉴

极客时间企业版

研发管理 研发团队培训

30分钟学会应用正则表达式

墨灵

正则表达式 前端进阶训练营

图解:如何实现最小生成树

淡蓝色

Java 数据结构 算法

Week 06 命题作业

Jeremy

腾讯面了五轮,面委挂了,挂的原因让大家唏嘘...

程序员生活志

腾讯 面试

第六周总结

Geek_a327d3

解决问题 1474 个,Flink 1.11 究竟有哪些易用性上的改善?

Apache Flink

flink

linux上强大的字符串匹配工具详解-grep

X先生

Shell grep

Python的四种作用域及调用顺序

BigYoung

Python 局部作用域 全局作用域

LeetCode题解:141. 环形链表,JavaScript HashMap,详细注释

Lee Chen

LeetCode 前端进阶训练营

MQTT的搭建、测试、应用及小程序的集成!

诸葛小猿

物联网 IoT mqtt broker

以中立性的立场看Severless的目标和流派

韩超

云原生 serverles

CAP原理

jason

Week 06学习总结

Jeremy

数十家技术社区联名推荐的GeekOnline来了!

Geek_116789

《北京市政务服务领域区块链应用创新蓝皮书(第一版)》正式发布

CECBC区块链专委会

我想模糊删除redis key🤔

山中兰花草

Java lua redis 面试 批量任务

可读代码编写炸鸡六 - 控制流尽量向前奔涌就好,不要分心

多选参数

代码 代码优化 代码规范 可读代码编写 可读代码

毕业半年的憨憨,将公司的代码上传到GitHub上了

诸葛小猿

GitHub 代码上传

可读代码编写炸鸡七 - 表达式太长就拆

多选参数

代码质量 代码组织 代码规范 可读代码编写 可读代码

解决方案|智能消防预警系统突破高层楼房限制

华为云开发者社区

AI 物联网 边缘计算 华为云

第六周作业

Geek_a327d3

寻找握剑的手,青睐懂行的人

脑极体

聊聊Dubbo(二):简单入门

猿灯塔

平价又好用的学习电脑小轩PRO来啦,为孩子创造超强学习体验

最新动态

计算机揭秘之:网络分类和性能分析

程序那些事

TCP 计算机网络 网络协议 计算机基础 udp

单例模式的几种写法你用的哪种?

Java小咖秀

Java 设计模式 23种设计模式

如何进行需求梳理及埋点方案设计

易观大数据

朱嘉明:区块链成为经济转型、形成产业新业态的技术手段

CECBC区块链专委会

区块链加持的家用摄像头能拯救你的隐私吗?

CECBC区块链专委会

企业架构框架之TOGAF

Winfield

企业架构

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

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