搜尋引擎由四部分組成:搜尋器、索引器、檢索器、使用者介面。其執行過程如下:
其中,網頁的分析演算法有pagerank,hits等,以下採用pagerank演算法
為自己亂寫了三個頁面,便於驗證自己的程式和之後的排序演算法是否正確。這三個頁面的引用關係為
採用scrapy框架
新建爬蟲專案:scrapy startproject search
然後進入目錄,新建爬蟲: scrapy genspider mysearch 爬取的網域名稱,之後可以修改
然後修改spiders/mysearch.py檔案
其中start_url是開始爬取的鏈結,parse函式是爬取後對結果的處理
爬取後,將爬取的頁面為以網頁鏈結命名的檔案儲存在result資料夾中,如下
並且同時生成引用關係的檔案result2/reltion.txt,用於儲存各個頁面間的引用關係,如下第一行為index.html引用了1.html
# 儲存爬取的內容
f2.write(response.url + "\n" + response.text)
# 對頁面進行分析,提取每乙個鏈結,加入到url中
for href in response.css('a::attr(href)').extract():
if href not in self.url:
try:
name2 = href
# 儲存頁面的引用關係
with open('d:/code/python/search/result2/relation.txt', 'a+') as f:
f.write(name2.split('/')[-1] + "," + name1 + "\n")
yield scrapy.request(href, callback=self.parse) # 生成器,對每乙個鏈結再進行爬取
except:
continue
然後scrapy crawl mysearch進行爬取
爬取過程
因為頁面比較簡單,就不生成索引,直接對所有爬取儲存的頁面內容搜尋
分為檢索和排序兩部分
採用pagerank演算法,因為該演算法是靜態的,所以在爬取完頁面後就可以直接生成各頁面的等級,頁面等級以字典形式儲存在result2/weight.txt中
演算法**來自知乎
但是感覺原作者演算法實現好像有點問題,自己做了一下修改
# 用於儲存圖
class graph():
def __init__(self):
self.linked_node_map = {} # 鄰接表,
self.pr_map = {} # 儲存每個節點的入度
self.l = {} # 存每個節點的出度
# 新增節點
def add_node(self, node_id):
if node_id not in self.linked_node_map:
self.linked_node_map[node_id] = set({})
self.pr_map[node_id] = 0
else:
print("這個節點已經存在")
# 增加乙個從node1指向node2的邊。允許新增新節點
def add_link(self, node1, node2):
if node1 not in self.linked_node_map:
self.add_node(node1)
self.l[node1] = 0
else:
self.l[node1] = self.l[node1] + 1
if node2 not in self.linked_node_map:
self.add_node(node2)
self.l[node2] = 0
else:
self.l[node2] = self.l[node2] + 1
self.linked_node_map[node1].add(node2) # 為node1新增乙個鄰接節點,表示ndoe2引用了node1
# 計算pr
def get_pr(self, epoch_num=3, d=0.5): # 配置迭代輪數,以及阻尼係數
for i in range(epoch_num):
for node in self.pr_map: # 遍歷每乙個節點
self.pr_map[node] = (1 - d) + d * sum(
[self.pr_map[temp_node] / self.l[temp_node] for temp_node in self.linked_node_map[node]]) # 原始版公式
with open('d:/code/python/search/result2/weight.txt', 'w') as f:
f.write(str(self.pr_map))
graph = graph()
with open('d:/code/python/search/result2/relation.txt', 'r') as f:
for line in f:
node1, node2 = line.strip().split(',')
graph.add_link(node1, node2)
graph.get_pr()
對輸入的內容進行搜尋,並且按頁面的等級從高到低顯示
程式在myuser.py中
import os
import ast
# 按照頁面等級排序
def p(s):
return str[s]
str = input("搜尋:")
fname = os.listdir(r'd:\code\python\search\result')
result =
for file in fname:
f = open('d:/code/python/search/result/' + file, 'r')
if str in f.read():
f2 = open('d:/code/python/search/result2/weight.txt', 'r')
str = f2.read()
str = ast.literal_eval(str) # 將讀入的字串轉化為字典型別
show = sorted(result, key=p, reverse=true)
print("搜尋結果如下\n")
print(show)
搜尋引擎原理
乙個搜尋引擎由搜尋器 索引器 檢索器和使用者介面等四個部分組成。1.搜尋器 搜尋器的功能是在網際網路中漫遊,發現和蒐集資訊。它常常是乙個電腦程式,日夜不停地執行。它要盡可能多 盡可能快地蒐集各種型別的新資訊,同時因為網際網路上的資訊更新很快,所以還要定期更新已經蒐集過的舊資訊,以避免死連線和無效連線...
搜尋引擎工作原理
搜尋引擎優化的主要任務之一就是提高 的搜尋引擎友好性,因此,搜尋引擎優化的每乙個環節都會與搜尋引擎工作流程存在必然的聯絡,研究搜尋引擎優化實際上就是對搜尋引擎工作過程進行逆向推理。因此,學習搜尋引擎優化應該從了解搜尋引擎的工作原理開始。搜尋引擎的主要工作包括 頁面收錄 頁面分析 頁面排序 及 關鍵字...
搜尋引擎工作原理
搜尋引擎工作原理 爬行和抓取 預處理 排名 爬行和抓取 1,是通過蛛蛛程式來實現的,蛛蛛主要是通過鏈結來抓取所有頁面的.所以要想讓蛛蛛盡量的抓取頁面,必須要吸引蛛蛛 優化 2,為了避免重複爬行和抓取 搜尋引擎建立了乙個位址庫用來儲存已經抓取的頁面 位址庫中的url 大多數是蛛蛛獲取到的,當然也有一些...