經過伯樂在線網站爲例子:node
而且咱們經過訪問伯樂在線也是能夠發現,咱們從任何一個子頁面其實都是能夠返回到首頁,因此當咱們爬取頁面的數據的時候就會涉及到去重的問題,咱們須要將爬過的url記錄下來,咱們將上圖進行更改算法
在爬蟲系統中,待抓取URL隊列是很重要的一部分,待抓取URL隊列中的URL以什麼樣的順序排隊列也是一個很重要的問題,由於這涉及到先抓取哪一個頁面,後抓取哪一個頁面。而決定這些URL排列順序的方法,叫作抓取策略。下面是經常使用的兩種策略:深度優先、廣度優先 網絡
深度優先是指網絡爬蟲會從起始頁開始,一個連接一個連接跟蹤下去,處理完這條線路以後再轉入下一個起始頁,繼續追蹤連接,經過下圖進行理解:app
注:scrapy默認採用的是深度優先算法scrapy
這裏是深度優先,因此這裏的爬取的順序式:
A-B-D-E-I-C-F-G-H (遞歸實現)網站
深度優先算法的實現(僞代碼):url
# 利用遞歸實現深度優先 def depth_tree(tree_node): if tree_node is not None: print(tree_node._data) if tree_node._left is not None: return depth_tree(tree_node._left) if tree_node._reght is not None: return depth_tree(tree_node._reght)
廣度優先,有人也叫寬度優先,是指將新下載網頁發現的連接直接插入到待抓取URL隊列的末尾,也就是指網絡爬蟲會先抓取起始頁中的全部網頁,而後在選擇其中的一個鏈接網頁,繼續抓取在此網頁中連接的全部網頁,經過下圖進行理解:spa
仍是以這個圖爲例子,廣度優先的爬取順序爲:
A-B-C-D-E-F-G-H-I (隊列實現)code
廣度優先代碼的實現(僞代碼):blog
# 利用隊列實現樹的廣度優先遍歷 def level_queue(root): if root is None: return my_queue=[] node = root my_queue.append(node) while my_queue: node=my_queue.pop(0) print(node.elem) if node.lchild is not None: my_queue.append(node.lchild) if node.rchild is not None: my_queue.append(node.rchild)