初学Python,写个搜索小偷,散分散分
[b]
起因
[/b]
刚街粗Python,走在路上的时候忽然有的一个想法,就是用Python截取搜索引擎的搜索结果,目的是可以利用一些强大的搜索引擎做站内搜索而又不显示他们的logo(也就是说把这些搜索引擎搜索的结果据为己有,至少看上去是自己的),又或者完全可以模仿一个Google或百度,这里说的模仿只是模仿他们的搜索结果,并不是他们的搜索引擎核心。
[b]分析:[/b]
分析了一些Google和百度的地址参数,比如我要搜索一个关键字“SuperSingo”,我在输入框输入SuperSingo并点击搜索后,地址栏变为:
Google:http://www.google.cn/search?complete=1&hl=zh-CN&q=SuperSingo&meta=
Baidu:http://www.baidu.com/s?wd=SuperSingo&cl=3
也就是说,我输入的关键字作为地址参数传递给某个程序,这个程序就会返回一个页面,上面包括顶部(logo和搜索UI)/结果部分/底部(版权信息部分),我们要得到的就是中间结果部分,这个可以用Python标准库的urllib中的urlopen方法得到整个页面的字符串,然后再解析这些字符串,完全有办法把中间结果部分抽取出来,抽出着串字符串,加上自己的头部和顶部和底部,那样搜索小偷的雏形就大概完成了,下面先写个测试代码。
[b]代码[/b]
[code]
# Search Thief
# creator: Singo
# date: 2007-8-24
import urllib
import re
class SearchThief:
" " "the google thief " " "
global path,targetURL
path = "pages\\ "
# targetURL = "http://www.google.cn/search?complete=1&hl=zh-CN&q= "
targetURL = "http://www.baidu.com/s?wd= "
def __init__(self,key):
self.key = key
def getPage(self):
webStr = urllib.urlopen(targetURL+self.key).read() # get the page string form the url
self.setPageToFile(webStr)
def setPageToFile(self,webStr):
reSetStr = re.compile( "\r ")
self.key = reSetStr.sub( " ",self.key) # replace the string "\r "
targetFile = file(path+self.key+ ".html ", "w ") # open the file for "w "rite
targetFile.write(webStr)
targetFile.close()
print "done "
inputKey = raw_input( "Enter you want to search --> ")
obj = SearchThief(inputKey)
obj.getPage()
[/code]
这里只是要求用户输入一个关键字,然后向搜索引擎提交请求,把返回的页面保存到一个目录下,这只是一个测试的例子,如果要做真正的搜索小偷,完全可以不保存这个页面,把抽取出来的字符串加入到我们预先设计好的模板里面,直接以web的形式显示在客户端,那样就可以实现利用盗取某些搜索引擎的结果并构造新的页面呈现。
[b]继续:[/b]
看一下百度搜索结果页的源码,在搜索结构的那个table标签前面有个 <DIV id=ScriptDiv> </DIV> 的标签,我们可以根据这个标签得到下移两行的结果集,于是增加一个方法getResultStr()
[code]
def getResultStr(self,webStr):
webStrList = webStr.read().split( "\r\n ")
line = webStrList.index( " <DIV id=ScriptDiv> </DIV> ")+2 # get the line from " <DIV id=ScriptDiv> </DIV> " move 2 line
resultStr = webStrList[line]
return resultStr
[/code]
既然得到结果列表,那么我们要把这个结果列表放到自己定义的页面里面,我们可以说这个页面叫模板:
[code]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN " "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns= "http://www.w3.org/1999/xhtml ">
<head>
<meta http-equiv= "Content-Type " content= "text/html; charset=gb2312 " />
<title> SuperSingo搜索-%title% </title>
<link href= "default/css/global.css " type=text/css rel=stylesheet>
</head>
<body>
<div id= "top ">
<div id= "logo "> <img src= "default/images/logo.jpg " /> </div>
<div id= "searchUI ">
<input type= "text " style= "width:300px; " />
<input type= "submit " value= "Search " />
</div>
<div class= "clear "/>
</div>
<div id= "result_info ">
工找到:×××条记录,耗时×××秒
</div>
<div id= "result "> %result% </div>
<div id= "foot ">
这里搜索的结构全都是百度那里过来的哦!
</div>
</body>
</html>
[/code]
其中%title%和%result%是等待替换的字符,为了替换这些字符,我们再增加一个方法,
[b]reCreatePage():[/b]
[code]
def reCreatePage(self,resultStr):
demoStr = urllib.urlopen(demoPage).read() # get the demo page string
reTitle = re.compile( "%title% ")
demoStr = reTitle.sub(self.key,demoStr) # re set the page title
reResult = re.compile( "%result% ")
demoStr = reResult.sub(resultStr,demoStr) # re set the page result
return demoStr
[/code]
这样就可以把模板中的%title%和%result%替换成我们想要的标签了。
[b]代码:[/b]
[code]
# the main programme
# creator: Singo
# date: 2007-8-24
import urllib
import re
class SearchThief:
" " "the google thief " " "
global path,targetURL,demoPage
path = "pages\\ "
# targetURL = "http://www.google.cn/search?complete=1&hl=zh-CN&q= "
targetURL = "http://www.baidu.com/s?wd= "
demoPage = path+ "__demo__.html "
def __init__(self,key):
self.key = key
def getPage(self):
webStr = urllib.urlopen(targetURL+self.key) # get the page string form the url
webStr = self.getResultStr(webStr) # get the result part
webStr = self.reCreatePage(webStr) # re create a new page
self.setPageToFile(webStr)
def getResultStr(self,webStr):
webStrList = webStr.read().split( "\r\n ")
line = webStrList.index( " <DIV id=ScriptDiv> </DIV> ")+2 # get the line from " <DIV id=ScriptDiv> </DIV> " move 2 line
resultStr = webStrList[line]
return resultStr
def reCreatePage(self,resultStr):
demoStr = urllib.urlopen(demoPage).read() # get the demo page string
reTitle = re.compile( "%title% ")
demoStr = reTitle.sub(self.key,demoStr) # re set the page title
reResult = re.compile( "%result% ")
demoStr = reResult.sub(resultStr,demoStr) # re set the page result
return demoStr
def setPageToFile(self,webStr):
reSetStr = re.compile( "\r ")
self.key = reSetStr.sub( " ",self.key) # replace the string "\r "
targetFile = file(path+self.key+ ".html ", "w ") # open the file for "w "rite
targetFile.write(webStr)
targetFile.close()
print "done "
inputKey = raw_input( "Enter you want to search --> ")
obj = SearchThief(inputKey)
obj.getPage()
[/code]
这样我们就可以得到一个自己定义的风格而含有百度搜索出来的结果的页面,这里只做了标题和结果及的替换,同样道理,我们还可以把“百度快照”替换掉,我们还可以重新生成翻页控件,这样一个搜索小偷就基本完成啦。
[b]问题:[/b]
用Python向Google请求时,Google会返回一个不是我们希望得到的页面,上面的内容是提示无权访问,Google很聪明,这步已经被他们想到了,但百度没做这样的限制哦,于是成功截取百度的数据。同样道理,还可以尝试其他搜索引擎,比如yisou和soso。
[b]后话:[/b]
做个自己的页面风格,盗取baidu的搜索结果,打造自己的品牌而利用别人的数据,甚至去掉baidu的广告加上自己的广告,这种做法实在是太不厚道了,哈哈哈。该程序只为学习python用,具体来说没什么意义。
[down=attachments/month_0708/92007826123442.rar]点击下载源码[/down]
By Singo
原文出处:http://www.03th.com/singo/singoblog
分不多,喜欢的顶一下,不喜欢的就当路过
[解决办法]
我以前试过抓google页面,可能一些headers设的不好,没抓成功,嫌麻烦,后来就没继续试。
楼主试这些的时候要小心点,抓google数据多了会被永久性封IP的。