當我們需要有一批貨物需要存放時,最好的方法就是有乙個倉庫進行保管。我們可以把url管理器看成乙個收集了資料的大倉庫,而**器就是這個倉庫貨物的搬運者。關於**器的問題,我們暫且不談。本篇主要討論的是在url管理器中,我們遇到重複的資料應該如何識別出來,避免像倉庫一樣過多的囤積相同的貨物。聽起來是不是很有意思,下面我們一起進入今天的學習。
如果乙個url管理器能夠具有以上4點功能,也算是「麻雀雖小,五臟俱全」了。然而,鏈結去重這個功能,應該怎麼實現?
鏈結去重是關係爬蟲效率的乙個比較關鍵的點,尤其是爬取的資料量極大的時候。在這個簡單的例子裡,由於資料量較少,我們不需要太過複雜的演算法,直接借助於python的set()函式即可,該函式可以生成乙個集合物件,其元素不可重複。
根據以上分析,url管理器的w**如下:
'''urlmanager
c程式設計客棧lass 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_urlprncwjjks"
if urlprncwjjks 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的基本功能和簡單的使用。
爬蟲學習 URL管理器和實現方法
url管理器一共有三種實現方法,作為個人,我們應當選擇哪種實現方法呢?答案就在下面 爬蟲的簡單架構 一 url管理器 實現方式 有三種 1.記憶體中 python中set 可以直接去除重複的元素 2.關聯式資料庫中 比如 mysql中的urls url,is crawled 建立乙個urls表包含兩...
11 URL管理器實現
管理待抓取的url集合和已抓取的url集合,管理器 防止重複抓取 防止迴圈抓取,管理器最小功能範圍如下 建立set集合 def init self 空集合 set 空 代表dict self.new url set self.old url set 編寫乙個方法,新增url defadd url s...
Python 包管理器
剛開始學習python時,在看文件和別人的blog介紹安裝包有的用easy install,setuptools,有的使用pip,distribute,那麼這幾個工具有什麼關係呢,看一下下面這個圖就明白了 可以看到distribute是setuptools的取代,pip是easy install的取...