獲得來自搜索引擎的關鍵字

一般情況下通過關鍵詞進入的頁面都是用戶想要的內容,對於某些搜索搜錄與關鍵詞相關度不是很高的頁面(例如列表頁),我們需要根據用戶搜索的關鍵詞對用戶進行引導,從而提高用戶的體驗,也可以提高網頁的PV。

  本文的原理是通過獲取來源頁面,分析來源URL的結構,提取出關鍵字,這些都是比較簡單的東西。本文闡述重點是如何區分出幾種常見的URL編碼方式,然後進行相應的解碼。因爲應用是在ASP中進行,因此本文若有代碼相關的例子,均是在ASP下調試通過的。其他語言下思想相同,且實現相對簡單些。

  提取各個搜索引擎的關鍵字

  現在的各大搜索引擎全是基於GET請求方式的,即在URL後面帶有一串參數。例如:我搜索“秋寒博客”

  谷歌:http://www.google.cn/search?sourceid=navclient&hl=zh-CN&ie=UTF-8&rlz=1T4GGLL_zh-CN___CN352&q=%e7%a7%8b%e5%af%92%e5%8d%9a%e5%ae%a2

  百度:http://www.baidu.com/s?wd=%C7%EF%BA%AE%B2%A9%BF%CD

  必應:http://cn.bing.com/search?q=%E7%A7%8B%E5%AF%92%E5%8D%9A%E5%AE%A2&form=QBLH&filt=all

  谷歌和Google的 q=%e7%a7%8b%e5%af%92%e5%8d%9a%e5%ae%a2 ,百度的 wd=%C7%EF%BA%AE%B2%A9%BF%CD ,必應的 q=%E7%A7%8B%E5%AF%92%E5%8D%9A%E5%AE%A2 中帶下劃線部分就是關鍵詞。 其他搜索引擎也大致相同,通過URL就可以看出關鍵詞的字段是哪個,然後可以通過正則將關鍵詞提出。

  提取主流搜索關鍵詞的正則如下:

  (?:yahoo.+?[\?|&]p=|openfind.+?query=|google.+?q=|lycos.+?query=|onseek.+?keyword=|search\.tom.+?word=|search\.qq\.com.+?word=|zhongsou\.com.+?word=|search\.msn\.com.+?q=|yisou\.com.+?p=|sina.+?word=|sina.+?query=|sina.+?_searchkey=|sohu.+?word=|sohu.+?key_word=|sohu.+?query=|163.+?q=|baidu.+?wd=|baidu.+?kw=|baidu.+?word=|3721\.com.+?p=|Alltheweb.+?q=|soso.+?w=|115.+?q=|youdao.+?q=|sogou.+?query=|bing.+?q=|114.+?kw=)([^&]*)

   以上正則是我根據網上的正則有所修改,讓其支持soso、115、youdao、sogou、bing(必應)、114(或118114)這些搜索,感謝作者提供。因爲網上轉載太多,尚未註明原出處,因此我也無法標明原作者。

  編碼類型的識別

  GB2312和UTF-8

  從上面的例子我們可以看出,同樣是搜索“秋寒博客”,但是不同的搜索對URL編碼後,形成的字符串也不同。谷歌和必應下面是“%e7%a7%8b%e5%af%92%e5%8d%9a%e5%ae%a2”,而在百度卻是“%C7%EF%BA%AE%B2%A9%BF%CD”。相信對網頁編碼瞭解的朋友都應該瞭解這是怎麼回事,不同的頁面編碼(charset)對相同的字符進行編碼後,產生的編碼也是不同的。UTF-8默認產生的是UTF-8的編碼,默認解碼也是UTF-8。GB2312等也一樣的。谷歌和必應用的是UTF-8編碼,而百度用的是GB2312編碼,就造成了相同的關鍵詞在不同的搜索下產生了不同的字符串。

  對於UTF-8和GB2312的解碼都可以實現,但是如果不知道目標是什麼編碼方式,就不知道如何去解碼了。如上面的兩個字符串,初給你看,看不來是用何種編碼方式。當然第一反應是通過搜索來判斷編碼方式,這種方法確實可行也有效。但是看看上面的正則,如果用這種方法,那麼一個 if 後面要跟很多的 or 才行。網上一般用的也是這樣的方法,我覺得這個不是最好的方法。我們得知的信息有:1、%xx%xx格式都是URL編碼(UTF-8或GB2312);2、GB2312中漢字要兩組%xx組成一個漢字,UTF-8要三組%xx組成一個漢字;3、如果用UTF-8解碼方式去解GB2312的編碼就會出現亂碼。

  單從長度和編碼的範圍我們根本無法辨別編碼方式,只能通過其他方式來判斷。根據上面3點,我們可以做一個假設:如果用UTF-8解碼方式來解GB2312的編碼會出現什麼情況?因爲UTF-8是有三組%xx組成的,而GB2312是由兩組%XX組成的,如果用UTF-8的解碼方式去解GB2312且能解碼成功,那解碼後的字符的長度一定會變短。例如:GB2312URL編碼的“秋寒博客”(%C7%EF%BA%AE%B2%A9%BF%CD)用UTF-8解碼,若能解碼成功,解碼後的字符長度會是2個半漢字。如果不能解碼成功,不用說就是GB2312編碼方式了。

  OK,至此我們初步已經知道如何去識別URL的編碼類型了,步驟如下:

  1、獲取關鍵字編碼串;

  2、取得編碼串的組數(x),例如:“%C7%EF%BA%AE%B2%A9%BF%CD 爲8組;

  3、用UTF-8解碼方式去解取得的編碼串;

  4、如果解碼失敗(即程序出錯)跳到第 8 步;

  5、如果解碼成功,取得解碼後的字符串長度(y),與全面的編碼串的組數除以3比較;

  6、如果 x!=y 那麼跳轉到第 8 步;

  7、如果 x=y 那麼得到的字符串即爲關鍵字;

  8、用GB2312方式解碼,得到的字符串爲關鍵字;

  上面步驟中,有幾點需要注意:

  1、第1步中需要將非漢字的URL轉義及英文去掉;

  2、第2、3、5步中的編碼串爲上面提到的字符串;

  3、第7、8步中解碼需要對原字符串進行;

  UNICODE

  在測試的過程中,發現soguo從網頁跳到圖片去的時候,會將URL編碼方式改爲UNICODE。UNICODE的方式相對比較好區分,即判斷是否爲\uxxxx或%uxxxx的形式即可。這個相對簡單,只分享在ASP中的解碼函數。

  以下代碼來自CSDN論壇:

  方法一:

  response.Write vbsUnEscape("\u5c0f\u867e\u7c73")

  Function vbsUnEscape(str)'解密

    dim i,s,c

    s=""

    For i=1 to Len(str)

      c=Mid(str,i,1)

      If Mid(str,i,2)="\u" and i<=Len(str)-5 Then

        If IsNumeric("&H" & Mid(str,i+2,4)) Then

          s = s & CHRW(CInt("&H" & Mid(str,i+2,4)))

          i = i+5

        Else

          s = s & c

        End If

      ElseIf c="%" and i<=Len(str)-2 Then

        If IsNumeric("&H" & Mid(str,i+1,2)) Then

          s = s & CHRW(CInt("&H" & Mid(str,i+1,2)))

          i = i+2

        Else

          s = s & c

        End If

      Else

        s = s & c

      End If

    Next

    vbsUnEscape = s

  End Function

  方法二:

  s = "\u5c0f\u867e\u7c73"

  s = Replace(s, "\u", "%u")

  Response.Write Unescape(s)

  在C#中也沒有發現能識別URL編碼格式的函數或方法,不知在PHP和JAVA下有沒有更好的方法呢?歡迎大家討論。

  來源:讀者沈力投稿,原文地址

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