首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

初学Python,写个搜索小偷,散分散分,该怎么处理

2012-03-03 
初学Python,写个搜索小偷,散分散分[b]起因[/b]刚街粗Python,走在路上的时候忽然有的一个想法,就是用Python

初学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的。

热点排行