python基礎爬蟲 深度優先與廣度優先

2021-10-18 08:06:31 字數 2662 閱讀 8628

困於心衡於慮而後作

今天的學習目標是:深度優先與廣度優先爬取資料

深度優先與廣度優先示意圖:

1.深度優先使用棧來完成

# 如果我們不適用遞迴程式實現深度優先的順序爬取網頁資料,也可以設計乙個棧stack來完成

# 在python中實現乙個棧很容易,python中的list就是乙個棧,很容易設計乙個自己的stack棧

import urllib.request

from bs4 import beautifulsoup

class

stack

:def

__init__

(self)

: self.st =

defpop

(self)

:return self.st.pop(

)def

push

(self, obj)

:def

empty

(self)

:return

len(self.st)==0

st = stack(

)start_url =

""st.push(start_url+

"books.htm"

)while

not st.empty():

url = st.pop(

) resp = urllib.request.urlopen(url)

data = resp.read(

) data = data.decode(

) soup=beautifulsoup(data,

'lxml'

)print

(soup.select(

'h3')[

0].text)

links=soup.select(

'a')

for link in links:

url=start_url+link[

'href'

] st.push(url)

# 其中push是壓棧,pop是出棧,empty是判斷是否為空

# 設計深度優先的順序爬取資料的客戶端程式的思想如下:

# 1.第乙個url入棧

# 2.如果棧為空程式就結束,如果不為空則出棧乙個url,爬取它的標題值

# 3.獲取url站點的所有超級鏈結的href的值,組成鏈結的列表links,把這些鏈結全部壓棧

# 4.回到第二步

# 深度優先類實現的方法與遞迴的方法執行的結果一致

2.廣度優先使用佇列實現

# 遍歷**樹還有一種廣度優先的順序,這就要使用到佇列

# 在python中實現乙個佇列很容易,python中的列表list就是乙個佇列,很容易設計乙個自己的佇列queue

import urllib.request

from bs4 import beautifulsoup

class

queue

:def

__init__

(self)

: self.st =

deffetch

(self)

:return self.st.pop(0)

defenter

(self, obj)

:def

empty

(self)

:return

len(self.st)==0

start_url =

""q = queue(

)q.enter(start_url +

"books.htm"

)while

not q.empty():

url = q.fetch(

) resp = urllib.request.urlopen(url)

data = resp.read(

) data = data.decode(

) soup = beautifulsoup(data,

'lxml'

)print

(soup.select(

'h3')[

0].text)

links = soup.select(

'a')

for link in links:

url = start_url + link[

'href'

] q.enter(url)

# 其中enter是入列,fetch是出列,empty是判斷是否為空

# 設計廣度優先的順序爬取資料的客戶端程式思想如下:

# 1.第乙個url入列

# 2.如果列為空則程式結束,如果不為空則出列乙個url,爬取它的標題值

# 3.獲取url站點的所有超級鏈結的href值,組成鏈結列表links,把這些鏈結全部入棧

# 4.回到第二步

python爬蟲廣度優先與深度優先 例項說明

感覺網上的文章都是以這篇為中心去照搬的 不過這篇文章也確實把廣度跟深度優先演算法說完了,但感覺沒有爬取例項的話還是挺抽象的,所以就配合例子說一下廣 深度優先。首先我們要知道 廣度優先 把同一等級的url全部爬取網然後再往下一級的url去爬取 深度優先 把乙個分頁的所有等級的url從淺到深爬取完後再爬...

基礎演算法 深度優先搜尋DFS與廣度優先搜尋BFS

深搜 depth first search 和廣搜 breadth first search 是兩種基本搜尋演算法,均採用窮舉策略 下面以老鼠走迷宮 maze.cpp 為例給出它們的模板 問題描述 乙隻老鼠從迷宮的左上角走到右下角 如下圖 中間不能穿越障礙 陰影部分 任務 給出迷宮的形狀,請你求出老...

遍歷 廣度優先與深度優先

第一步,建立佇列,元素操作規則為 佇列尾部加入元素,頭部移除元素 第二步,把資料夾加入該佇列 第三步,從該佇列頭移除資料夾,同時依次遍歷它的所有孩子,如果孩子是檔案,則提取 如果孩子是資料夾,則加入佇列尾部 第四步,重複第三步 直到隊列為空為止。到此資料夾中所有檔案都被獲取 獲取資料夾下所有檔案 p...