用Python標(biāo)準庫修改搜索引擎獲取結(jié)果
Python標(biāo)準庫在長時間的使用中需要不斷的學(xué)習(xí)。下面我們就看看如何才能更好的掌握相關(guān)的技術(shù)信息。希望對大家之后的使用和學(xué)習(xí)有所幫助。下面的就是想大家介紹下相關(guān)的使用方法。
我輸入的關(guān)鍵字作為地址參數(shù)傳遞給某個程序,這個程序就會返回一個頁面,上面包括頂部(logo和搜索UI)/結(jié)果部分/底部(版權(quán)信息部分),我們要得到的就是中間結(jié)果部分,這個可以用Python標(biāo)準庫的urllib中的urlopen方法得到整個頁面的字符串,然后再解析這些字符串,完全有辦法把中間結(jié)果部分抽取出來,抽出著串字符串,加上自己的頭部和頂部和底部,那樣搜索小偷的雛形就大概完成了,下面先寫個測試代碼。
- [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):
- rereSetStr = 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]
這里只是要求用戶輸入一個關(guān)鍵字,然后向搜索引擎提交請求,把返回的頁面保存到一個目錄下,這只是一個測試的例子,如果要做真正的搜索小偷,完全可以不保存這個頁面,把抽取出來的字符串加入到我們預(yù)先設(shè)計好的模板里面,直接以web的形式顯示在客戶端,那樣就可以實現(xiàn)利用盜取某些搜索引擎的結(jié)果并構(gòu)造新的頁面呈現(xiàn)。
看一下百度搜索結(jié)果頁的源碼,在搜索結(jié)構(gòu)的那個table標(biāo)簽前面有個 <DIV id=Div> </DIV> 的標(biāo)簽,我們可以根據(jù)這個標(biāo)簽得到下移兩行的結(jié)果集,于是增加一個方法。
- getResultStr()
- [code]
- def getResultStr(self,webStr):
- webStrwebStrList = webStr.read().split( "\r\n ")
- line = webStrList.index( " <DIV id=Div> </DIV> ")+2 # get the line from " <DIV id=Div> </DIV> " move 2 line
- resultStr = webStrList[line]
- return resultStr
- [/code]
既然得到結(jié)果列表,那么我們要把這個結(jié)果列表放到自己定義的頁面里面,我們可以說這個頁面叫模板:
- [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>
- < http-equivhttp-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 ">
這里搜索的結(jié)構(gòu)全都是百度那里過來的哦!其中%title%和%result%是等待替換的字符,為了替換這些字符,我們再增加一個方法, #p#
- [b]reCreatePage():[/b]
- [code]
- def reCreatePage(self,resultStr):
- demoStr = urllib.urlopen(demoPage).read() # get the demo page string
- rereTitle = re.compile( "%title% ")
- demoStr = reTitle.sub(self.key,demoStr) # re set the page title
- rereResult = re.compile( "%result% ")
- demoStr = reResult.sub(resultStr,demoStr) # re set the page result
- return demoStr
- [/code]
這樣就可以把模板中的%title%和%result%替換成我們想要的標(biāo)簽了。
- [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):
- webStrwebStrList = webStr.read().split( "\r\n ")
- line = webStrList.index( " <DIV id=Div> </DIV> ")+2 # get the line from " <DIV id=Div> </DIV> " move 2 line
- resultStr = webStrList[line]
- return resultStr
- def reCreatePage(self,resultStr):
- demoStr = urllib.urlopen(demoPage).read() # get the demo page string
- rereTitle = re.compile( "%title% ")
- demoStr = reTitle.sub(self.key,demoStr) # re set the page title
- rereResult = re.compile( "%result% ")
- demoStr = reResult.sub(resultStr,demoStr) # re set the page result
- return demoStr
- def setPageToFile(self,webStr):
- rereSetStr = 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]
這樣我們就可以得到一個自己定義的風(fēng)格而含有百度搜索出來的結(jié)果的頁面,這里只做了標(biāo)題和結(jié)果及的替換,同樣道理,我們還可以把“百度快照”替換掉,我們還可以重新生成翻頁控件,這樣一個搜索小偷就基本完成啦。
用Python標(biāo)準庫向Google請求時,Google會返回一個不是我們希望得到的頁面,上面的內(nèi)容是提示無權(quán)訪問,Google很聰明,這步已經(jīng)被他們想到了,但百度沒做這樣的限制哦,于是成功截取百度的數(shù)據(jù)。同樣道理,還可以嘗試其他搜索引擎,比如yisou和soso。
做個自己的頁面風(fēng)格,盜取baidu的搜索結(jié)果,打造自己的品牌而利用別人的數(shù)據(jù),甚至去掉baidu的廣告加上自己的廣告,這種做法實在是太不厚道了,哈哈哈。該程序只為學(xué)習(xí)python標(biāo)準庫用,具體來說沒什么意義。
【編輯推薦】