您的位置:首页 > 其它

通过刷新搜索词看三种主要搜索引擎区别

2008-04-14 17:24 330 查看
探测搜索引擎
目前的搜索引擎具有一些智能引导的功能,当输入一个关键词搜索后,返回的内容中会包括相关内容的搜索链接。比如,我们在google、百度中搜索“电影”,返回的页面中会有“免费电影”、“在线电影”、“电影下载”等多项搜索的链接。应该是引擎根据关键字作出了判断,把用户可能会感兴趣的相关内容展示给用户。
这个功能对网站的推广有一定的用处。比如,为了让网站的相关关键字发生联系,有一种网上介绍的推广方法就是用这些关键字的组合去大量地刷新引擎。通过这种人为的方式影响搜索引擎的返回结果。
好了,现在我们手里有了几十组关键字的组合,一开始的做法是发动公司相关人员打开网页进入搜索。再使用这些关键词去搜索。这种方法太依赖人,脚本程序最适合做这种重复的工作。当然,刷新的频率不能太高,以免被引擎列入黑名单。不过这种做法是否真的有效,只有做搜索引擎的人知道了。

好,我们的方案是使用Python,这是一种脚本语言,非常简单。几句话就写好了。比如:
import urllib
f = urllib.urlopen('http://www.google.com')
print f.read()
这几句话的意思是访问google的首页。现在我们把要搜索的关键字加上,只需要修改urlopen函数()里面的地址即可:
百度的:f = urllib.urlopen('http://www.baidu.com/s?wd=%CA%D3%CE%C0%CD%F8')
google中国的:f = urllib.urlopen('http://www.google.cn/search?hl=zh-CN&q=%E8%A7%86%E5%8D%AB%E7%BD%91&btnG=Google+%E6%90%9C%E7%B4%A2&meta=&aq=f')
雅虎中国的:f = urllib.urlopen('http://search.cn.yahoo.com/search?ei=gbk&fr=fp-tab-web-ycn&pid=ysearch&source=yahoo_yhp_0706_search_button&p=%CA%D3%CE%C0%CD%F8')
运行,返回了不同的结果。百度和雅虎的都能够顺利通过。google却返回了一个错误页面:



上面页面的大概意思是没有权限该访问。奇怪了,把上面这个地址拷贝下来,直接输入到浏览器中,没有任何问题啊?难道google还有什么神秘武器?
于是把抓包的软件打开,直接抓取通过浏览器和通过Python访问的http协议报文。

这是通过浏览器访问的报文:



这是通过Python访问的报文:



我们可以看到,除了头部信息不太完整外,主要是“User-Agent”的内容不一样。联想到google公司是Python应用的大户,他们肯定想到会有人用Python脚本去刷引擎,估计在返回结果的时候做了判断,认为这种脚本访问是非法的。

三种引擎,同样的访问内容,只有google对自己做了保护。看样子搜索老大确实是计高一筹。

搞定google
通过对上面抓包内容的分析,发现只有http协议中“User-Agent”有差异导致google不能正常返回。换一种方法,构造一个象真正的浏览器发出的请求,会怎么样呢?
重新编写脚本,这次使用另外的方法:

import httplib, urllib
params = urllib.urlencode({})
headers = {
"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7",
"Accept-Encoding": "gzip,deflate",
"Accept-Language": "zh-cn,en;q=0.7,en-us;q=0.3",
"Accept": "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
“User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13",
}
conn = httplib.HTTPConnection("www.google.cn")
conn.request("GET", "/search?hl=zh-CN&q=%E8%A7%86%E5%8D%AB%E7%BD%91&btnG=Google+%E6%90%9C%E7%B4%A2&meta=&aq=f", params, headers)
response = conn.getresponse()
print response.status, response.reason
data = response.read()
#print data
conn.close()

再次运行并抓包,发现这次构造一个虚拟的firefox请求报文,访问成功!多次调试后发现,其实header的内容不是必须的,可以全部去掉。代码可以简化为:

import httplib, urllib
conn = httplib.HTTPConnection("www.google.cn")
conn.request("GET", "/search?hl=zh-CN&q=%E8%A7%86%E5%8D%AB%E7%BD%91&btnG=Google+%E6%90%9C%E7%B4%A2&meta=&aq=f")
response = conn.getresponse()
print response.status, response.reason
data = response.read()
conn.close()

剩下的是体力活
好了,剩下的工作就是加上需要搜索的关键字,加上定时和循环的逻辑。都是体力活了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐