深度優先是指網絡爬蟲會從起始頁開始,一個鏈接一個鏈接跟蹤下去,處理完這條線路之后再轉入下一個起始頁,繼續追蹤鏈接
廣度優先,有人也叫寬度優先,是指將新下載網頁發現的鏈接直接插入到待抓取URL隊列的末尾,也就是指網絡爬蟲會先抓取起始頁中的所有網頁,然后在選擇其中的一個連接網頁,繼續抓取在此網頁中鏈接的所有網頁
經過官方文檔查詢,因為scrapy使用的是后進先出隊列,基本可以看成是深度優先(DFO)。如果需要設置廣度優先(BFO),可以在settings中添加以下代碼。另外當DEPTH_PRIORITY為正值時越靠廣度優先,負值則越靠深度優先,默認值為0
廣度優先,有人也叫寬度優先,是指將新下載網頁發現的鏈接直接插入到待抓取URL隊列的末尾,也就是指網絡爬蟲會先抓取起始頁中的所有網頁,然后在選擇其中的一個連接網頁,繼續抓取在此網頁中鏈接的所有網頁
經過官方文檔查詢,因為scrapy使用的是后進先出隊列,基本可以看成是深度優先(DFO)。如果需要設置廣度優先(BFO),可以在settings中添加以下代碼。另外當DEPTH_PRIORITY為正值時越靠廣度優先,負值則越靠深度優先,默認值為0
以下設置Scrapy廣度優先,爬取最新數據
# 爬蟲允許的最大深度,可以通過meta查看當前深度;0表示無深度 DEPTH_LIMIT = 3 # 爬取時,0表示深度優先Lifo(默認);1表示廣度優先FiFo # 后進先出,深度優先 # DEPTH_PRIORITY = 0 # SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleLifoDiskQueue' # SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.LifoMemoryQueue' # 先進先出,廣度優先 DEPTH_PRIORITY = 1 SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue' SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'
Scrapy默認通過深度優先算法實現
深度優先輸出:A、B、D、E、I、C、F、G、H(遞歸實現)
廣度優先輸出:A、B、C、D、E、F、G、H、I(隊列實現)
# 深度優先算法實現 # 遞歸實現 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._right is not None: return depth_tree(tree_node._right)
# 廣度優先算法實現 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)
scrapy 設置爬取深度
通過在settings.py中設置DEPTH_LIMIT的值可以限制爬取深度,這個深度是與start_urls中定義url的相對值。也就是相對url的深度。例如定義url為:http://www.domz.com/game/,DEPTH_LIMIT=1那么限制爬取的只能是此url下一級的網頁。深度大於設置值的將被ignore。
如圖: