即使你沒聽說過“維基百科六度分隔理論”,也很可能聽過“凱文 • 貝肯 (Kevin Bacon)的六度分隔值游戲”。在這兩個游戲中,目標都是把兩 個不相干的主題(在前一種情況中是相互鏈接的維基百科詞條,而在后 一種情況中是出現在同一部電影中的演員)用一個鏈條(至多包含 6 個 主題,包括原來的兩個主題)連接起來。
比如,埃里克 • 艾德爾和布蘭登 • 弗雷澤都出現在電影《騎警杜德雷》 里,布蘭登 • 弗雷澤又和凱文 • 貝肯都出現在電影《我呼吸的空氣》 里。因此,根據這兩個條件,從埃里克 • 艾德爾到凱文 • 貝肯的鏈條 長度只有 3 個主題。
感謝 The Oracle of Bacon 的存在,滿足了我對這類關系鏈的好奇心。
我們將在本節創建一個項目來實現“維基百科六度分隔理論”的查找方 法。也就是說,我們要實現從埃里克 • 艾德爾的詞條頁面 (https://en.wikipedia.org/wiki/Eric_Idle)開始,經過最少的鏈接點擊次 數找到凱文 • 貝肯的詞條頁面(https://en.wikipedia.org/wiki/Kevin_Bacon)。
這么做對維基百科的服務器負載有多大影響?
根據維基媒體基金會(維基百科所屬的組織)的統計,該網站每秒 會收到大約2500次點擊,其中超過 99% 的點擊都指向維基百科域 名[詳情請見“維基媒體統計圖”(Wikimedia in Figures)里的“流量 數據”(Traffic Volume)部分內容]。因為網站流量很大,所以你 的網絡爬蟲不可能對維基百科的服務器負載產生顯著影響。不過, 如果你頻繁地運行本書的代碼示例,或者自己創建項目來抓取維基 百科的詞條,那么希望你能夠向維基媒體基金會提供一點捐贈—— 不只是為了抵消你占用的服務器資源,也是為了其他人能夠利用維 基百科這個教育資源。
還需要注意的是,如果你準備利用維基百科的數據做一個大型項 目,應該確認該數據是不能夠通過維基百科 API 獲取的。維基百科 網站經常被用于演示爬蟲,因為它的 HTML 結構簡單并且相對穩定。但是它的 API 往往會使得數據獲取更加高效。 你應該已經知道如何寫一段 Python 代碼,來獲取維基百科網站的任何 頁面并提取該頁面中的鏈接了。
from urllib.request import urlopen from bs4 import BeautifulSouphtml = urlopen('http://en.wikipedia.org/wiki/Kevin_Bacon') bs = BeautifulSoup(html, 'html.parser') for link in bs.find_all('a'): if 'href' in link.attrs: print(link.attrs['href'])
如果你觀察生成的一列鏈接,會看到你想要的所有詞條鏈接都在里 面:“Apollo 13”“Philadelphia”“Primetime Emmy Award”,等等。但是, 也有一些你不需要的鏈接:
//wikimediafoundation.org/wiki/Privacy_policy
新聞熱點
疑難解答