中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

python爬蟲之如何遍歷單個域名-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關python爬蟲之如何遍歷單個域名的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

10年積累的成都網(wǎng)站建設、網(wǎng)站設計經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先網(wǎng)站設計后付款的網(wǎng)站建設流程,更有榮昌免費網(wǎng)站建設讓你可以放心的選擇與我們合作。創(chuàng)新互聯(lián)建站專注于拜城網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供拜城營銷型網(wǎng)站建設,拜城網(wǎng)站制作、拜城網(wǎng)頁設計、拜城網(wǎng)站官網(wǎng)定制、小程序設計服務,打造拜城網(wǎng)絡公司原創(chuàng)品牌,更為您提供拜城網(wǎng)站排名全網(wǎng)營銷落地服務。創(chuàng)新互聯(lián)建站專注于甘德網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供甘德營銷型網(wǎng)站建設,甘德網(wǎng)站制作、甘德網(wǎng)頁設計、甘德網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務,打造甘德網(wǎng)絡公司原創(chuàng)品牌,更為您提供甘德網(wǎng)站排名全網(wǎng)營銷落地服務。

即使你沒聽說過“維基百科六度分隔理論”,也很可能聽過“凱文 ? 貝肯 (Kevin Bacon)的六度分隔值游戲”。在這兩個游戲中,目標都是把兩 個不相干的主題(在前一種情況中是相互鏈接的維基百科詞條,而在后 一種情況中是出現(xiàn)在同一部電影中的演員)用一個鏈條(至多包含 6 個 主題,包括原來的兩個主題)連接起來。

比如,埃里克 ? 艾德爾和布蘭登 ? 弗雷澤都出現(xiàn)在電影《騎警杜德雷》 里,布蘭登 ? 弗雷澤又和凱文 ? 貝肯都出現(xiàn)在電影《我呼吸的空氣》 里。因此,根據(jù)這兩個條件,從埃里克 ? 艾德爾到凱文 ? 貝肯的鏈條 長度只有 3 個主題。

感謝 The Oracle of Bacon 的存在,滿足了我對這類關系鏈的好奇心。

我們將在本節(jié)創(chuàng)建一個項目來實現(xiàn)“維基百科六度分隔理論”的查找方 法。也就是說,我們要實現(xiàn)從埃里克 ? 艾德爾的詞條頁面 (https://en.wikipedia.org/wiki/Eric_Idle)開始,經(jīng)過最少的鏈接點擊次 數(shù)找到凱文 ? 貝肯的詞條頁面(https://en.wikipedia.org/wiki/Kevin_Bacon)。

這么做對維基百科的服務器負載有多大影響?

根據(jù)維基媒體基金會(維基百科所屬的組織)的統(tǒng)計,該網(wǎng)站每秒 會收到大約2500次點擊,其中超過 99% 的點擊都指向維基百科域 名[詳情請見“維基媒體統(tǒng)計圖”(Wikimedia in Figures)里的“流量 數(shù)據(jù)”(Traffic Volume)部分內(nèi)容]。因為網(wǎng)站流量很大,所以你 的網(wǎng)絡爬蟲不可能對維基百科的服務器負載產(chǎn)生顯著影響。不過, 如果你頻繁地運行本書的代碼示例,或者自己創(chuàng)建項目來抓取維基 百科的詞條,那么希望你能夠向維基媒體基金會提供一點捐贈—— 不只是為了抵消你占用的服務器資源,也是為了其他人能夠利用維 基百科這個教育資源。

還需要注意的是,如果你準備利用維基百科的數(shù)據(jù)做一個大型項 目,應該確認該數(shù)據(jù)是不能夠通過維基百科 API 獲取的。維基百科 網(wǎng)站經(jīng)常被用于演示爬蟲,因為它的 HTML 結(jié)構(gòu)簡單并且相對穩(wěn)定。但是它的 API 往往會使得數(shù)據(jù)獲取更加高效。 你應該已經(jīng)知道如何寫一段 Python 代碼,來獲取維基百科網(wǎng)站的任何 頁面并提取該頁面中的鏈接了。

from urllib.request import urlopen from bs4 import BeautifulSoup
html = 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
//en.wikipedia.org/wiki/Wikipedia:Contact_us

其實,維基百科的每個頁面都充滿了側(cè)邊欄、頁眉和頁腳鏈接,以及連 接到分類頁面、對話頁面和其他不包含詞條的頁面的鏈接:

/wiki/Category:Articles_with_unsourced_statements_from_April_2014 
/wiki/Talk:Kevin_Bacon

最近我有個朋友在做一個類似的維基百科抓取項目,他說,為了判斷一 個維基百科內(nèi)鏈是否鏈接到一個詞條頁面,他寫了一個很大的過濾函 數(shù),代碼超過了 100 行。不幸的是,他沒有提前花很多時間去尋找“詞 條鏈接”和“其他鏈接”之間的模式,也可能他后來發(fā)現(xiàn)了。如果你仔細 觀察那些指向詞條頁面(不是指向其他內(nèi)部頁面)的鏈接,會發(fā)現(xiàn)它們 都有 3 個共同點:

  • 它們都在 id 是 bodyContent 的 div 標簽里

  • URL 不包含冒號

  • URL 都以 /wiki/ 開頭

我們可以利用這些規(guī)則稍微調(diào)整一下代碼來僅獲取詞條鏈接,使用的正則表達式為 ^(/wiki/)((?!:).)*$"):

from urllib.request import urlopen 
from bs4 import BeautifulSoup 
import re
html = urlopen('http://en.wikipedia.org/wiki/Kevin_Bacon') 
bs = BeautifulSoup(html, 'html.parser') 
for link in bs.find('div', {'id':'bodyContent'}).find_all(  
'a', href=re.compile('^(/wiki/)((?!:).)*$')):  
if 'href' in link.attrs:    
print(link.attrs['href'])

如果你運行以上代碼,就會看到維基百科上凱文 ? 貝肯詞條里所有指向 其他詞條的鏈接。

當然,寫程序來找出這個靜態(tài)的維基百科詞條里所有的詞條鏈接很有 趣,不過沒什么實際用處。你需要讓這段程序更像下面的形式。

  • 一個函數(shù) getLinks,可以用一個 /wiki/< 詞條名稱 > 形式的維 基百科詞條 URL 作為參數(shù),然后以同樣的形式返回一個列表,里 面包含所有的詞條 URL。

  • 一個主函數(shù),以某個起始詞條為參數(shù)調(diào)用 getLinks,然后從返回 的 URL 列表里隨機選擇一個詞條鏈接,再次調(diào)用 getLinks,直到 你主動停止程序,或者在新的頁面上沒有詞條鏈接了。

完整的代碼如下所示:

from urllib.request import urlopen 
from bs4 import BeautifulSoup 
import datetime 
import random 
import re

random.seed(datetime.datetime.now()) 
def getLinks(articleUrl):  html = urlopen('http://en.wikipedia.org{}'.format(articleUrl))  
bs = BeautifulSoup(html, 'html.parser')  
return bs.find('div', {'id':'bodyContent'}).find_all('a',    
href=re.compile('^(/wiki/)((?!:).)*$'))
links = getLinks('/wiki/Kevin_Bacon') 
while len(links) > 0:
newArticle = links[random.randint(0, len(links)-1)].attrs['href']  
print(newArticle)  
links = getLinks(newArticle)

導入需要的 Python 庫之后,程序首先做的是用系統(tǒng)當前時間設置隨機 數(shù)生成器的種子。這樣可以保證每次程序運行的時候,維基百科詞條的 選擇都是一個全新的隨機路徑。

偽隨機數(shù)和隨機數(shù)種子

在前面的示例中,為了能夠連續(xù)地隨機遍歷維基百科,我用 Python 的隨機數(shù)生成器在每個頁面上隨機選擇一個詞條鏈接。但是,用隨 機數(shù)的時候需要格外小心。

雖然計算機很擅長做精確計算,但是它們處理隨機事件時非常不靠 譜。因此,隨機數(shù)是一個難題。大多數(shù)隨機數(shù)算法都努力生成一個 呈均勻分布且難以預測的數(shù)字序列,但是在算法初始化階段都需要 提供一個隨機數(shù)“種子”(random seed)。而完全相同的種子每次將 生成同樣的“隨機”數(shù)序列,因此我將系統(tǒng)時間作為生成新隨機數(shù)序 列(和新隨機詞條序列)的起點。這樣做會讓程序運行的時候更具 有隨機性。

其實,Python 的偽隨機數(shù)生成器用的是梅森旋轉(zhuǎn)(Mersenne Twister)算法,它生成的隨機數(shù)很難預測且呈均勻分布,就是有點 兒耗費 CPU 資源。真正好的隨機數(shù)可不便宜! 然后,程序定義 getLinks 函數(shù),它接收一個 /wiki/< 詞條名稱 > 形 式的維基百科詞條 URL 作為參數(shù),在前面加上維基百科的域名 http://en.wikipedia.org,再用該域名的 HTML 獲得一個 BeautifulSoup 對象。之后,基于前面介紹過的參數(shù),抽取一列詞條 鏈接所在的標簽 a 并返回它們。 程序的主函數(shù)首先把起始頁面 https://en.wikipedia.org/wiki/Kevin_Bacon 里的詞條鏈接列表設置成鏈接標簽列表(links 變量)。然后用一個循 環(huán),從頁面中隨機找一個詞條鏈接標簽并抽取 href 屬性,打印這個頁 面,再把這個鏈接傳入 getLinks 函數(shù),重新獲取新的鏈接列表。

當然,這里只是簡單地構(gòu)建一個從一個頁面到另一個頁面的爬蟲,要解 決“維基百科六度分隔理論”問題還需要再做一點兒工作。我們還應該存儲 URL 鏈接數(shù)據(jù)并分析數(shù)據(jù)。

感謝各位的閱讀!關于“python爬蟲之如何遍歷單個域名”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

本文題目:python爬蟲之如何遍歷單個域名-創(chuàng)新互聯(lián)
路徑分享:http://www.rwnh.cn/article30/cehspo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、網(wǎng)站設計、標簽優(yōu)化、面包屑導航網(wǎng)站維護、微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設
宜昌市| 玉山县| 隆尧县| 遂平县| 黄冈市| 天水市| 石家庄市| 唐山市| 樟树市| 四平市| 永康市| 黑山县| 舞钢市| 达拉特旗| 岳阳市| 高清| 丁青县| 泽库县| 黄浦区| 永清县| 阜新市| 卓资县| 庄河市| 新乡县| 惠水县| 乳源| 博罗县| 望谟县| 卓资县| 内乡县| 确山县| 靖远县| 玉溪市| 乾安县| 大新县| 东光县| 林周县| 威远县| 吴旗县| 衡山县| 大丰市|