網站的樹結構
通過伯樂在線網站為例子:
並且我們通過訪問伯樂在線也是可以發現,我們從任何一個子頁面其實都是可以返回到首頁,所以當我們爬取頁面的數據的時候就會涉及到去重的問題,我們需要將爬過的url記錄下來,我們將上圖進行更改
在爬蟲系統中,待抓取URL隊列是很重要的一部分,待抓取URL隊列中的URL以什么樣的順序排隊列也是一個很重要的問題,因為這涉及到先抓取哪個頁面,后抓取哪個頁面。而決定這些URL排列順序的方法,叫做抓取策略。下面是常用的兩種策略:深度優先、廣度優先
深度優先
深度優先是指網絡爬蟲會從起始頁開始,一個鏈接一個鏈接跟蹤下去,處理完這條線路之后再轉入下一個起始頁,繼續追蹤鏈接,通過下圖進行理解:
注:scrapy默認采用的是深度優先算法
這里是深度優先,所以這里的爬取的順序式:
A-B-D-E-I-C-F-G-H (遞歸實現)
深度優先算法的實現(偽代碼):
# 利用遞歸實現深度優先 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隊列的末尾,也就是指網絡爬蟲會先抓取起始頁中的所有網頁,然后在選擇其中的一個連接網頁,繼續抓取在此網頁中鏈接的所有網頁,通過下圖進行理解:
還是以這個圖為例子,廣度優先的爬取順序為:
A-B-C-D-E-F-G-H-I (隊列實現)
廣度優先代碼的實現(偽代碼):
# 利用隊列實現樹的廣度優先遍歷 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)