最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python爬蟲(chóng)之遍歷單個(gè)域名

 更新時(shí)間:2019年11月20日 15:00:17   投稿:laozhang  
在本篇文章里小編給大家整理的是一篇關(guān)于python遍歷單個(gè)域名的知識(shí)點(diǎn)和操作方法,有需要的朋友們學(xué)習(xí)下。

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

比如,埃里克 • 艾德?tīng)柡筒继m登 • 弗雷澤都出現(xiàn)在電影《騎警杜德雷》 里,布蘭登 • 弗雷澤又和凱文 • 貝肯都出現(xiàn)在電影《我呼吸的空氣》 里。因此,根據(jù)這兩個(gè)條件,從埃里克 • 艾德?tīng)柕絼P文 • 貝肯的鏈條 長(zhǎng)度只有 3 個(gè)主題。

感謝 The Oracle of Bacon 的存在,滿足了我對(duì)這類(lèi)關(guān)系鏈的好奇心。

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

這么做對(duì)維基百科的服務(wù)器負(fù)載有多大影響?

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

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

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'])

如果你觀察生成的一列鏈接,會(huì)看到你想要的所有詞條鏈接都在里 面:“Apollo 13”“Philadelphia”“Primetime Emmy Award”,等等。但是, 也有一些你不需要的鏈接:

//wikimediafoundation.org/wiki/Privacy_policy
//en.wikipedia.org/wiki/Wikipedia:Contact_us

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

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

最近我有個(gè)朋友在做一個(gè)類(lèi)似的維基百科抓取項(xiàng)目,他說(shuō),為了判斷一 個(gè)維基百科內(nèi)鏈?zhǔn)欠矜溄拥揭粋€(gè)詞條頁(yè)面,他寫(xiě)了一個(gè)很大的過(guò)濾函 數(shù),代碼超過(guò)了 100 行。不幸的是,他沒(méi)有提前花很多時(shí)間去尋找“詞 條鏈接”和“其他鏈接”之間的模式,也可能他后來(lái)發(fā)現(xiàn)了。如果你仔細(xì) 觀察那些指向詞條頁(yè)面(不是指向其他內(nèi)部頁(yè)面)的鏈接,會(huì)發(fā)現(xiàn)它們 都有 3 個(gè)共同點(diǎn):

  • 它們都在 id 是 bodyContent 的 div 標(biāo)簽里
  • URL 不包含冒號(hào)
  • URL 都以 /wiki/ 開(kāi)頭

我們可以利用這些規(guī)則稍微調(diào)整一下代碼來(lái)僅獲取詞條鏈接,使用的正則表達(dá)式為 ^(/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'])

如果你運(yùn)行以上代碼,就會(huì)看到維基百科上凱文 • 貝肯詞條里所有指向 其他詞條的鏈接。

當(dāng)然,寫(xiě)程序來(lái)找出這個(gè)靜態(tài)的維基百科詞條里所有的詞條鏈接很有 趣,不過(guò)沒(méi)什么實(shí)際用處。你需要讓這段程序更像下面的形式。

  • 一個(gè)函數(shù) getLinks,可以用一個(gè) /wiki/< 詞條名稱(chēng) > 形式的維 基百科詞條 URL 作為參數(shù),然后以同樣的形式返回一個(gè)列表,里 面包含所有的詞條 URL。
  • 一個(gè)主函數(shù),以某個(gè)起始詞條為參數(shù)調(diào)用 getLinks,然后從返回 的 URL 列表里隨機(jī)選擇一個(gè)詞條鏈接,再次調(diào)用 getLinks,直到 你主動(dòng)停止程序,或者在新的頁(yè)面上沒(méi)有詞條鏈接了。

完整的代碼如下所示:

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)

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

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

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

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

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

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

以上就是關(guān)于python爬蟲(chóng)之遍歷單個(gè)域名的全部知識(shí)點(diǎn),感謝大家的學(xué)習(xí)和對(duì)腳本之家的支持。

相關(guān)文章

  • 解決PySide+Python子線程更新UI線程的問(wèn)題

    解決PySide+Python子線程更新UI線程的問(wèn)題

    今天小編就為大家分享一篇解決PySide+Python子線程更新UI線程的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • pytorch模型部署 pth轉(zhuǎn)onnx的方法

    pytorch模型部署 pth轉(zhuǎn)onnx的方法

    這篇文章主要介紹了pytorch模型部署 pth轉(zhuǎn)onnx的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • Python datetime模塊的使用示例

    Python datetime模塊的使用示例

    這篇文章主要介紹了Python datetime模塊的使用示例,幫助大家更好的理解和使用python處理時(shí)間,感興趣的朋友可以了解下
    2021-02-02
  • 淺談scrapy 的基本命令介紹

    淺談scrapy 的基本命令介紹

    下面小編就為大家?guī)?lái)一篇淺談scrapy 的基本命令介紹。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 基于Python采集爬取微信公眾號(hào)歷史數(shù)據(jù)

    基于Python采集爬取微信公眾號(hào)歷史數(shù)據(jù)

    這篇文章主要介紹了基于Python采集爬取微信公眾號(hào)歷史數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 安裝Python和pygame及相應(yīng)的環(huán)境變量配置(圖文教程)

    安裝Python和pygame及相應(yīng)的環(huán)境變量配置(圖文教程)

    下面小編就為大家?guī)?lái)一篇安裝Python和pygame及相應(yīng)的環(huán)境變量配置(圖文教程)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • python編寫(xiě)網(wǎng)頁(yè)爬蟲(chóng)腳本并實(shí)現(xiàn)APScheduler調(diào)度

    python編寫(xiě)網(wǎng)頁(yè)爬蟲(chóng)腳本并實(shí)現(xiàn)APScheduler調(diào)度

    爬蟲(chóng)爬的頁(yè)面是京東的電子書(shū)網(wǎng)站頁(yè)面,每天會(huì)更新一些免費(fèi)的電子書(shū),爬蟲(chóng)會(huì)把每天更新的免費(fèi)的書(shū)名以第一時(shí)間通過(guò)郵件發(fā)給我,通知我去下載
    2014-07-07
  • Selenium常見(jiàn)八大定位法總結(jié)

    Selenium常見(jiàn)八大定位法總結(jié)

    自動(dòng)化最基礎(chǔ)的就屬于定位元素了,元素不會(huì)定位,基本上已經(jīng)團(tuán)滅了,就不用再去考慮什么自動(dòng)化了,下面這篇文章主要給大家介紹了關(guān)于Selenium常見(jiàn)八大定位法的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • python偏函數(shù)partial用法

    python偏函數(shù)partial用法

    這篇文章要給大家分享得是python偏函數(shù)partial用法,主要介紹什么是偏函數(shù)partial、偏函數(shù)的作用、偏函數(shù)的語(yǔ)法及案例詳情,需要的朋友可以參考一下文章得具體詳解,希望對(duì)你有所幫助
    2021-10-10
  • matplotlib.pyplot.plot()參數(shù)使用詳解

    matplotlib.pyplot.plot()參數(shù)使用詳解

    這篇文章主要介紹了matplotlib.pyplot.plot()參數(shù)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評(píng)論

嘉祥县| 扎赉特旗| 邢台市| 东明县| 太仓市| 十堰市| 新巴尔虎左旗| 贡觉县| 无极县| 青海省| 错那县| 琼中| 香格里拉县| 饶平县| 微山县| 牙克石市| 茌平县| 同江市| 廊坊市| 宜川县| 榆林市| 高青县| 通渭县| 嘉鱼县| 阜宁县| 名山县| 遂川县| 基隆市| 和田市| 轮台县| 潍坊市| 奈曼旗| 永川市| 平定县| 宣恩县| 明星| 广宁县| 庄河市| 新蔡县| 吉林省| 蕲春县|