① 利用python能否開發網路搜索引擎
當然能拉 最著名的搜索引擎google就是用python實現的
python是面向對象的 結構清晰 適合做大的項目
python可以做任何事(包括搜索引擎)
我現在也在用python
留下聯系方式交流一下經驗阿
② 如何用Python爬取搜索引擎的結果
我選取的是爬取網路知道的html 作為我的搜索源數據,目前先打算做網頁標題的搜索,選用了 Python 的 scrapy 庫來對網頁進行爬取,爬取網頁的標題,url,以及html,用sqlist3來對爬取的數據源進行管理。
爬取的過程是一個深度優先的過程,設定四個起始 url ,然後維護一個資料庫,資料庫中有兩個表,一個 infoLib,其中存儲了爬取的主要信息:標題,url ,html;另一個表為urlLib,存儲已經爬取的url,是一個輔助表,在我們爬取每個網頁前,需要先判斷該網頁是否已爬過(是否存在urlLib中)。在數據存儲的過程中,使用了SQL的少量語法,由於我之前學過 MySQL ,這塊處理起來比較駕輕就熟。
深度優先的網頁爬取方案是:給定初始 url,爬取這個網頁中所有 url,繼續對網頁中的 url 遞歸爬取。代碼逐段解析在下面,方便自己以後回顧。
1.建一個 scrapy 工程:
關於建工程,可以參看這個scrapy入門教程,通過運行:
[python] view plain
scrapy startproject ***
在當前目錄下建一個scrapy 的項目,然後在 spiders 的子目錄下建立一個 .py文件,該文件即是爬蟲的主要文件,注意:其中該文件的名字不能與該工程的名字相同,否則,之後調用跑這個爬蟲的時候將會出現錯誤,見ImportError。
2.具體寫.py文件:
[python] view plain
import scrapy
from scrapy import Request
import sqlite3
class rsSpider(scrapy.spiders.Spider): #該類繼承自 scrapy 中的 spider
name = "" #將該爬蟲命名為 「知道」,在執行爬蟲時對應指令將為: scrapy crawl
#download_delay = 1 #只是用於控制爬蟲速度的,1s/次,可以用來對付反爬蟲
allowed_domains = ["..com"] #允許爬取的作用域
url_first = 'http://..com/question/' #用於之後解析域名用的短字元串
start_urls = ["http://..com/question/647795152324593805.html", #python
"http://..com/question/23976256.html", #database
"http://..com/question/336615223.html", #C++
"http://..com/question/251232779.html", #operator system
"http://..com/question/137965104.html" #Unix programing
] #定義初始的 url ,有五類知道起始網頁
#add database
connDataBase = sqlite3.connect(".db") #連接到資料庫「.db」
cDataBase = connDataBase.cursor() #設置定位指針
cDataBase.execute('''''CREATE TABLE IF NOT EXISTS infoLib
(id INTEGER PRIMARY KEY AUTOINCREMENT,name text,url text,html text)''')
#通過定位指針操作資料庫,若.db中 infoLib表不存在,則建立該表,其中主鍵是自增的 id(用於引擎的docId),下一列是文章的標題,然後是url,最後是html
#url dataBase
cDataBase.execute('''''CREATE TABLE IF NOT EXISTS urlLib
(url text PRIMARY KEY)''')
#通過定位指針操作資料庫,若.db中urlLib表不存在,則建立該表,其中只存了 url,保存已經爬過的url,之所以再建一個表,是猜測表的主鍵應該使用哈希表存儲的,查詢速度較快,此處其實也可以用一個外鍵將兩個表關聯起來
2. .py文件中的parse函數:
.py文件中的parse函數將具體處理url返回的 response,進行解析,具體代碼中說明:
[python] view plain
def parse(self,response):
pageName = response.xpath('//title/text()').extract()[0] #解析爬取網頁中的名稱
pageUrl = response.xpath("//head/link").re('href="(.*?)"')[0] #解析爬取網頁的 url,並不是直接使用函數獲取,那樣會夾雜亂碼
pageHtml = response.xpath("//html").extract()[0] #獲取網頁html
# judge whether pageUrl in cUrl
if pageUrl in self.start_urls:
#若當前url 是 start_url 中以一員。進行該判斷的原因是,我們對重復的 start_url 中的網址將仍然進行爬取,而對非 start_url 中的曾經爬過的網頁將不再爬取
self.cDataBase.execute('SELECT * FROM urlLib WHERE url = (?)',(pageUrl,))
lines = self.cDataBase.fetchall()
if len(lines): #若當前Url已經爬過
pass #則不再在資料庫中添加信息,只是由其為跟繼續往下爬
else: #否則,將信息爬入資料庫
self.cDataBase.execute('INSERT INTO urlLib (url) VALUES (?)',(pageUrl,))
self.cDataBase.execute("INSERT INTO infoLib (name,url,html) VALUES (?,?,?)",(pageName,pageUrl,pageHtml))
else: #此時進入的非 url 網頁一定是沒有爬取過的(因為深入start_url之後的網頁都會先進行判斷,在爬取,在下面的for循環中判斷)
self.cDataBase.execute('INSERT INTO urlLib (url) VALUES (?)',(pageUrl,))
self.cDataBase.execute("INSERT INTO infoLib (name,url,html) VALUES (?,?,?)",(pageName,pageUrl,pageHtml))
self.connDataBase.commit() #保存資料庫的更新
print "-----------------------------------------------" #輸出提示信息,沒啥用
for sel in response.xpath('//ul/li/a').re('href="(/question/.*?.html)'): #抓出所有該網頁的延伸網頁,進行判斷並對未爬過的網頁進行爬取
sel = "http://..com" + sel #解析出延伸網頁的url
self.cDataBase.execute('SELECT * FROM urlLib WHERE url = (?)',(sel,)) #判斷該網頁是否已在資料庫中
lines = self.cDataBase.fetchall()
if len(lines) == 0: #若不在,則對其繼續進行爬取
yield Request(url = sel, callback=self.parse)
③ 畢業設計中怎樣用python寫一個搜索引擎的分
1、 網路連接需要持續連接(persistent connection),DNS解析的瓶頸(先查本地DNS緩存)
實現方法:基於python httplib(對http1.1完成對持續連接的支持(python的httplib完全支持http1.1),如果不是http1.1那麼可以使用urlopen對其進行一次連接)並對其socket對象進行控制,關鍵是加入對讀取DNS本地緩存(在我的機制下這個根本就不是主要問題可以暫時忽略),以及有settimeout(Igloo)(搞定,就用setdefaulttimeout())的支持(或者利用自己的DNS伺服器,進行優化處理),以及對sock對象的settimeout進行設置,防止長時間的等待一個有可能連接不上的web伺服器.(要測試一下連接模塊和DNS解析模塊在訪問不存在url在默認情況下的時間消耗)對站點的ip解析出來後就直接用ip進行連接而避免了重復調用DNS解析.例子:socket.gethostbyname("www.163.com")
網路連接下載模塊非常重要,需要精心反復測試,因為有可能碰到一些不規范的web伺服器,如果沒有加以考慮會使整個線程崩潰。
2、 多線程:機器任務的分配及站點任務的分配。
實現方法:(在某台機器上實現,在對本機內存cpu的消耗情況判斷後對機器任務進行分配;在對和站點的連接情況進行判斷後對站點任務進行分配)
機器任務的分配:對於機器負擔的情況調整在一個機器開的線程的個數。(在關閉線程時注意要先讓線程完成當前運行任務)
站點任務的分配:就是某個機器對一個站點開的線程的個數的分配。(同樣是要注意關閉線程時先讓其完成當前任務)
3、 對web文件樹遍歷過程更好的控制,對web文件樹在廣度優先遍歷時層次的判斷。(整個網路是一個圖,而某個站點的模型更接近於一棵樹)
實現方法:在每個地址進入隊列時加一個層次號,那麼要遍歷第n層的話那麼遍歷到第一個n+1就停止讀取。
4、 利用robotparser解析robots.txt
5、 單個機器spider的作用:
a) 同2多線程3文件樹的遍歷
b) 將獲取的外部url發回中央控制器,並從中央控制器取回新的外部url。
6、 中央控制器的作用:
a) 觀察各機器的狀態包括:cpu、內存、線程、站點、網路流量
b) 觀察對外整體網路流量和連接狀況,可以根據網路狀況來調節timeout。
c) 接受各個機器發送過來的外部url並對每個url的重復數字計數。然後分配到各個機器。(分配時要用爬行策略控制器對外部url進行排序來分配,Igloo利用Page Rank,我們可以使用最簡單的重復越多重要系數就越高來進行排序)
d) 分布式URL分配演算法:Igloo1.2的二級哈希映射演算法(集中式分配演算法那個中央控制器容易成為系統瓶頸)復習哈希演算法,還有就是對url是否訪問過的判斷(Igloo使用的是URL Trie滯後合並策略)。可以使用Berkeley DB作為URL Trie的替代品。兩種實現方式的比較:
i. 現在的想法:(面向站點,信息顆粒大)外部鏈接只是保存主機名比如:www.163.com, 站內訪問用解析好的ip地址維持連接,用相對鏈接來得到各個頁面,這樣就要維護一個外部鏈接列表,幾個站點的鏈接列表。優點:節省內存,對某個站點的信息獲取全面,對站點的出現頻率統計,排序,重要站點先取。 缺點:對鏈接的獲取的全面性得不到保證,而且不能獲取更多的重要頁面,每個站點的重要頁面也不會很多。
ii. 老方案:(面向頁面,信息顆粒小)所有連接一視同仁。缺點:浪費資源,對單一站點的獲取不一定全面。優點:可以得到全面的鏈接圖,可以使用Page Rank對列表進行排序,頁面更重要就在最前面。
7、 解析html(超級鏈接的提取)搞定(用python的sgmllib)缺點:速度太慢(可能會造成瓶頸,要好好包裝好,以後有機會換掉它)
④ 求一python寫的簡單的搜索引擎
可能幫不上忙。
但別的語言有現成的。
用java 的 solr做搜索,索引,分詞。只需要配置xml,不用寫代碼。
然後加上前端頁面搜索就完成了。
用python的scrapy可以做爬蟲。
你的需求我感覺簡單做,都不需要索引,直接查資料庫。模糊查詢
還有一個java的nutch,幾乎不用寫代碼,直接爬蟲+索引+界面 一套都實現好了,什麼高亮,快照都有,直接用。
不知道你能出多少錢?
⑤ 用python實現網頁搜索功能
不知道你知道不知道AJAX,如果知道這個就容易弄了,用jq來POST數據,然後前面只用一個靜太頁就可以,點搜索就用ajax把搜索請求發過去,點修改就發修改請求
如果在一個頁面要實現也可以在下面加一個隱藏的input用來定義是哪個功能,然後後台再根據這個功能名去判斷如何處理
⑥ python基於內容的搜索引擎怎麼開發
...這個免費是不會給你的。。相信我沒錯的。
⑦ 用python製作一個搜索引擎
可能幫不上忙。但別的語言有現成的。用java 的 solr做搜索,索引,分詞。只需要配置xml,不用寫代碼。然後加上前端頁面搜索就完成了。用python的scrapy可以做爬蟲。你的需求我感覺簡單做,都不需要索引,直接查資料庫。模糊查詢還有一個java的nutch,幾乎不用寫代碼,直接爬蟲+索引+界面 一套都實現好了,什麼高亮,快照都有,直接用。不知道你能出多少錢?
⑧ Python能做搜索引擎么
我用Python寫了一個搜索引擎
網頁鏈接
⑨ python自製簡易搜索引擎有何思路
python. 如果只是研究演算法,做一個原型,當然python優雅多了. 但個人認為,perl和python都不是做搜索引擎的最合適的選擇吧.
⑩ 編寫python爬蟲,類搜索引擎的程序是否有意義
最初有一個想法,就是用程序來寫一個類似搜索引擎的爬蟲,然後24小時循環抓取互聯網上盡可能多的網站數據。
接著用這個數據來配合做seo。目前已經完成了24小時不間斷抓取Url部分。主要是用python做的。其他程序也試過。但是效率太低、要麼耗內存。還是python最好。
我的問題是:有沒有python方面經驗豐富的朋友? 能夠提供一些方向的? 比如正文提取這一部分,這個有現成的模塊嗎? 自己寫的話,有點難度。我查過資料,python有爬蟲類的模塊。但是還沒接觸過。希望能有前輩可以指導一下。真的,在此謝過了。
還有就是,想問下做這個東西你覺得有意義嗎?
【回復】
首先要肯定,你做這個開發是很有意義的。我去年的時候用C#開發過一個蜘蛛抓取系統和正文分析系統,雖然比較粗糙,但是也從過程中感悟到了更深刻SEO優化策略。
例如配額的問題,我在家裡自己架伺服器然後一個抓一個分析,一切都是以低費用原則展開的,所以帶寬自然是不充裕的。這個情況下我就深刻的意識到要抓什麼網站,要抓什麼類型的頁面,時間和線程怎麼分配比例,哪些內容是長期不更新的,哪些是具有實時更新意義的等等,通常做SEO的朋友,沒辦法真的換位去思考這些內容,所以只能等著別分享後再去思考,但是大多數分享也是淺嘗則止,具體的細節和原則還是需要自己去摸索和實驗的。
另外當我試圖去分析HTML的時候,就遇到了前所未有的「無限可能」,因為你的思路幾乎是瞬間爆炸了,什麼導航條麵包屑,頁面噪音(代碼層面,內容層面),HTML的標准化(涉及到DOM樹是否正確的解析),H1優化,尋找最大正文段落等等,太多的細節可以去做分析。
其中我做了一個關於頁面噪音的小測試,就是去試圖針對一個網站,通過對比HTML獲得類目框架。目的就是不想亂七八糟的內容影響我分析正文,所以這里要最基礎的去除噪音。這樣一來,周邊零散的代碼就被我視為「低質量的,可忽略的,重要性較低的」的內容。
又例如如何判斷頁面類型呢?列表頁和內容頁?不同的頁面也會影響二次抓取的頻率,因為列表頁很顯然更具備更新能力,而內容頁則相對不更新(主內容框架內不更新,周邊框架內容更新,但意義不大)。所以當搜索什麼「列車時刻」一類的詞,默認列表頁會有更大的機會,而當你搜索知識性內容則內容頁會有更大的可能性。當然這些都是可以通過系統設置的一個「偏重權重」來實現。
總的來說,當你開發一個搜索引擎的時候,哪怕這個搜索引擎再簡單和粗糙,你也會真正的有機會站在搜索引擎的角度去思考SEO,這種思考和感悟是深刻而實際的,遠比盲人摸象更有指導意義。
python中,有三個庫可以解析html文本,HTMLParser,sgmllib,htmllib。但是更推薦你試試BeautifulSoup。
關於正文的提取,不知道你是要所有正文文本的提取,還是最核心的內容的判斷。
如果是提取所有HTML標簽內的文本,那麼解析器遍歷一下,就可以獲得一個清單了。
如果你要獲得一個「相對最重要正文區域」,那麼就需要根據每一個DOM樹中的內容量做一個初步的判斷,當然如果要更准確無誤的判
斷正文,還需要其他很多細節的驗證操作。
順著你的話題,我在擴展一下。
我建議大家有時間可以閱讀有關「方_法_論」方面的書籍,因為通常,我們在一個行業或一個職位上,所關注和處理的工作,都是一個整
體系統中的一個局部,而是否能盡量多的去理解這個整體系統,對我們的控制能力來說,是至關重要的。所以真正要做好SEO,就不能
僅僅追求SEO的技巧,要更多時間去理解搜索引擎。
淘寶也好,亞馬遜(海外)也好,網路也好,都是一個平台,我們無論要做運營,還是SEO,其本質都是充分的獲得平台的資源分配。
這個時候誰能站在平台的角度,誰就有更大的競爭力。這就好比產品經理們常常說的,站在用戶的角度去開發產品。
你做這個事情,整個過程就是一個極其寶貴的學習過程,這樣做的人非常少,你很棒!加油!