python爬蟲學習第三十天

2021-08-07 08:11:14 字數 3021 閱讀 9023

今天的內容:維基百科六度分割:終結篇

還記得之前,我們建立了收集從凱文 ·貝肯開始的維基詞條鏈結的爬蟲,最後儲存在資料庫 裡。為什麼這裡又把這個遊戲搬出來?因為它體現了一種從乙個頁面指向另乙個頁面的鏈 接路徑選擇問題(即找出 和 org/wiki/eric_idle 鏈結路徑) ,這和從上面的馬爾可夫鏈裡找出乙個單詞到另乙個單詞的路 徑的問題是一樣的。這類問題被稱為有向圖(directed graph)問題,其中 a → b 連通,並 不意味著 b → a 同樣連通。單詞「football」後面可能經常跟的是單詞「player」 ,但是單 詞「player」後面卻很少跟著單詞「football」 。雖然凱文 ·貝肯(kevin bacon)的維基詞條 連線到他的老家費城(philadelphia) ,但是費城的維基百科詞條裡卻沒有連線他的鏈結。 相反,原來的凱文 ·貝肯六度分割遊戲是乙個無向圖(undirected graph)問題。例如凱 文 · 貝肯和朱莉婭 ·羅伯茨(julia roberts)共同演過電影《別闖陰陽界》(flatliners, 1990) ,因此凱文 ·貝肯詞條通過《別闖陰陽界》的維基詞條會鏈結到朱莉婭 ·羅伯茨詞 條,而朱莉婭 ·羅伯茨詞條也會通過《別闖陰陽界》的維基詞條鏈結到凱文 ·貝肯詞條, 兩者的關係是相互的(就是沒有「方向」性) 。在電腦科學中,無向圖問題相比有向圖 問題不太常見,兩者都屬於計算難題。

找出維基百科中凱文 ·貝肯詞條和其他詞條之間最短鏈結路徑的方法中,效果 最好且最常用的一種方法是廣度優先搜尋

練習 用之前獲得的鏈結資料表,實現乙個完整的廣度優先搜尋演算法

from urllib.request import urlopen

from bs4 import beautifulsoup

import pymysql

conn = pymysql.connect(host="127.0.0.1",user="root",passwd="gaoji1996",charset="utf8")

cur = conn.cursor()

cur.execute("use scraping")

class

solutionfund

(runtimeerror):

def__init__

(self,message):

self.message = message

pass

pass

defgetlinks

(frompageid):

cur.execute("select topageid from wikipedialinks where frompageid=%s",(frompageid))

if cur.rowcount ==0:

return

none

else:

return [x[0] for x in cur.fetchall()]

pass

defconstructdict

(currentpageid):

links = getlinks(currentpageid)

if links:

return dict(zip(links, [{}]*len(links)))

return {}

pass

defsearchdepth

(currentpageid,targetpageid,depth,linktree):

if depth ==0:

return linktree

ifnot linktree:

linktree = constructdict(currentpageid)

ifnot linktree:

return {}

if targetpageid in linktree.keys():

print("target "+str(targetpageid)+" found!")

raise solutionfund("page: "+str(currentpageid))

for branchkey,branchvalue in linktree.items():

try:

linktree[branchkey] = searchdepth(branchkey,targetpageid,depth-1,branchvalue)

except solutionfund as e:

print(e.message)

raise solutionfund("page: "+str(currentpageid))

return linktree

pass

try:

searchdepth(1,1000,6,{})

print("there is no path !")

except solutionfund as e:

print(e.message)

這裡函式 getlinks 和 constructdict 是輔助函式,用來從資料庫裡獲取給定頁面的鏈結, 然後把鏈結轉換成字典。主函式 searchdepth 會遞迴地執行,同時構建和搜尋鏈結樹,一 次搜尋一層。其執行規則如下所示

• 如果遞迴限制已經到達(即程式已經呼叫過很多次) ,就停止搜尋,返回結果。

• 如果函式獲取的鏈結字典是空的,就對當前頁面的鏈結進行搜尋。如果當前頁面也沒鏈 接,就返回空鏈結字典。

• 如果當前頁面包含我們搜尋的頁面鏈結,就把頁面id複製到遞迴的棧頂,然後丟擲一 個異常,顯示頁面已經找到。遞迴過程中的每個棧都會列印當前頁面id,然後丟擲異 常顯示頁面已經找到,最終列印在螢幕上的就是乙個完整的頁面id路徑列表。

• 如果鏈結沒找到,把遞迴限制減一,然後呼叫函式搜尋下一層鏈結。

輸出例項如下:

target 1000 found!

page: 757

page: 400

page: 60

page: 2

page: 1

這段**理解起來花了不少時間,但弄懂了以後對於廣度優先搜尋的理解加深了,今天就先到這,打卡~

python全棧第三十天 git

目錄 git 本地 安裝建立本地倉庫 設定倉庫資訊 檢視檔案狀態記錄 新增修改到工作區 從工作區刪除 從工作區恢復 提交到快取區 檢視快取區的歷史記錄 儲存更改記錄 遠端 轉殖本地推送到遠端 標籤 分支檢視分支 建立分支 切換分支 合併分支 刪除分支 推送分支 git commit m 注釋 git...

Redis學習之環境搭建(第三十天)

redis是乙個開源的使用ansi c語言編寫 遵守bsd協議 支援網路 可基於記憶體亦可持久化的日誌型 key value資料庫,並提供多種語言的api。資料結構伺服器,因為 value 可以是 字串 string 雜湊 hash 列表 list 集合 sets 和 有序集合 sorted set...

第三十天 二叉樹的後序遍歷

今天是釋然發題解的第三十天,以後會經常和大家分享學習路上的心得,希望和大家一起進步,一起享受coding的樂趣 本文約2100字,預計閱讀7分鐘 很多天前我們學習了二叉樹,忘記的小夥伴們可以看一下哦 二叉樹我們想一下假如說一棵樹是這樣的 3,9,20,null,null,15,7 這棵樹應該長這樣 ...