资源预览内容
第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
亲,该文档总共4页全部预览完了,如果喜欢就下载吧!
资源描述
获得来自搜索引擎的关键字获得来自搜索引擎的关键字一般情况下通过关键词进入的页面都是用户想要的内容,对于某些搜索搜录与关键词相关度不是很高的页面(例如列表页) ,我们需要根据用户搜索的关键词对用户进行引导,从而提高用户的体验,也可以提高网页的 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(“u5c0fu867eu7c73“)Function vbsUnEscape(str)解密dim i,s,cs=“For i=1 to Len(str)c=Mid(str,i,1)If Mid(str,i,2)=“u“ and i=Len(str)-5 ThenIf IsNumeric(“&H“ & Mid(str,i+2,4) Thens = s & CHRW(CInt(“&H“ & Mid(str,i+2,4)i= i+5Elses = s & cEnd IfElseIf c=“%“ and i=Len(str)-2 ThenIf IsNumeric(“&H“ & Mid(str,i+1,2) Thens = s & CHRW(CInt(“&H“ & Mid(str,i+1,2)i= i+2Elses = s & cEnd IfElses = s & cEnd IfNextvbsUnEscape = sEnd Function方法二:s = “u5c0fu867eu7c73“s = Replace(s, “u“, “%u“)Response.Write Unescape(s)在 C#中也没有发现能识别 URL 编码格式的函数或方法, 不知在 PHP 和 JAVA 下有没有更好的方法呢?欢迎大家讨论。来源:读者沈力投稿,原文地址。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号