Serverless實踐系列(五):如何將搜索引擎去廣告?

現在大部分搜索引擎都有付費推廣的內容,我們經常在使用搜索引擎的時候,會被這些付費搜索的東西所幹擾,例如,搜索在線編程這個詞條:

可以看到這個詞條,在一頁屏幕上面,前面幾個結果都是推廣,這其中大部分命中的關鍵詞是“編程”,而不是在線編程,這就會擾亂我們視聽,也會給我們帶來很不友好的體驗,那麼我們是否可以通過雲函數SCF來做一個簡單的工具,來屏蔽掉這些廣告呢?

回答是當然可以,本教程將會通過SCF+COS來實現一個簡單的網頁搜索小工具,至於爲啥叫搜索小工具,而不是叫去廣告搜索小工具,結尾的地方,再詳細說。

尋找廣告特點

在對列表頁代碼研究過程中,我們發現,非廣告頁代碼有:

而推廣內容,則沒有這個內容,所以,可以通過正則化,或者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"))
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 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 = ""
    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 實踐系列(四):網站監控腳本的實現》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章