python爬蟲中url管理器去重操作例項
阿新 • • 發佈:2020-12-01
當我們需要有一批貨物需要存放時,最好的方法就是有一個倉庫進行保管。我們可以把URL管理器看成一個收集了資料的大倉庫,而下載器就是這個倉庫貨物的搬運者。關於下載器的問題,我們暫且不談。本篇主要討論的是在url管理器中,我們遇到重複的資料應該如何識別出來,避免像倉庫一樣過多的囤積相同的貨物。聽起來是不是很有意思,下面我們一起進入今天的學習。
URL管理器到底應該具有哪些功能?
- URL下載器應該包含兩個倉庫,分別存放沒有爬取過的連結和已經爬取過的連結。
- 應該有一些函式負責往上述兩個倉庫裡新增連結
- 應該有一個函式負責從新url倉庫中隨機取出一條連結以便下載器爬取
- URL下載器應該能識別重複的連結,已經爬取過的連結就不需要放進倉庫了
如果一個URL管理器能夠具有以上4點功能,也算是“麻雀雖小,五臟俱全”了。然而,連結去重這個功能,應該怎麼實現?
連結去重是關係爬蟲效率的一個比較關鍵的點,尤其是爬取的資料量極大的時候。在這個簡單的例子裡,由於資料量較少,我們不需要太過複雜的演算法,直接藉助於python的set()函式即可,該函式可以生成一個集合物件,其元素不可重複。
根據以上分析,URL管理器的w程式碼如下:
''' UrlManager class UrlManager(object): def __init__(self): #初始化的時候就生成兩個url倉庫 self.new_urls = set() self.old_urls = set() #判斷新url倉庫中是否還有沒有爬取的url def has_new_url(self): return len(self.new_urls) #從new_url倉庫獲取一個新的url def get_new_url(self): return self.new_urls.pop() def add_new_url(self,url): #這個函式後來用不到了…… ''' 將一條url新增到new_urls倉庫中 parm url: str return: if url is None: return #只需要判斷old_urls中沒有該連結即可,new_urls在新增的時候會自動去重 if url not in self.old_urls: self.new_urls.add(url) def add_new_urls(self,urls): 將多條url新增到new_urls倉庫中 parm url: 可迭代物件 print "start add_new_urls" if urls is None or len(urls) == 0: for url in urls: self.add_new_url(url) def add_old_url(self,url): self.old_urls.add(url) print "add old url succefully" #獲取已經爬取過的url的數目 def old_url_size(self): return len(self.old_urls)
嘗試過以上程式碼的小夥伴,已經成功學會用url管理器篩選重複的資料了。相信大家經過今天的學習,已經能夠了解url的基本功能和簡單的使用。
到此這篇關於python爬蟲中url管理器去重操作例項的文章就介紹到這了,更多相關python爬蟲中url管理器如何去重內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!