2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

網(wǎng)頁(yè)爬蟲(chóng)及其用到的算法和數(shù)據(jù)結(jié)構(gòu)

 corefashion 2014-10-25

網(wǎng)絡(luò)爬蟲(chóng),是一種按照一定的規(guī)則,自動(dòng)的抓取萬(wàn)維網(wǎng)信息的程序或者腳本。網(wǎng)絡(luò)爬蟲(chóng)是搜索引擎系統(tǒng)中十分重要的組成部分,它負(fù)責(zé)從互 聯(lián)網(wǎng)中搜集網(wǎng)頁(yè),采集信息,這些網(wǎng)頁(yè)信息用于建立索引從而為搜索 引擎提供支持,它決定著整個(gè)引擎系統(tǒng)的內(nèi)容是否豐富,信息是否即 時(shí),因此其性能的優(yōu)劣直接影響著搜索引擎的效果。


網(wǎng)絡(luò)爬蟲(chóng)程序的優(yōu)劣,很大程度上反映了一個(gè)搜索引擎的好差。不信,你可以隨便拿一個(gè)網(wǎng)站去查詢一下各家搜索對(duì)它的網(wǎng)頁(yè)收錄情況,爬蟲(chóng)強(qiáng)大程度跟搜索引擎好壞基本成正比。


1.世界上最簡(jiǎn)單的爬蟲(chóng)——三行情詩(shī)


我們先來(lái)看一個(gè)最簡(jiǎn)單的最簡(jiǎn)單的爬蟲(chóng),用python寫(xiě)成,只需要三行。

import requests
url='http://www.'
r=requests.get(url)

上面這三行爬蟲(chóng)程序,就如下面這三行情詩(shī)一般,很干脆利落。


是好男人,

就應(yīng)該在和女友吵架時(shí),

抱著必輸?shù)男膽B(tài)。


2.一個(gè)正常的爬蟲(chóng)程序


上面那個(gè)最簡(jiǎn)單的爬蟲(chóng),是一個(gè)不完整的殘疾的爬蟲(chóng)。因?yàn)榕老x(chóng)程序通常需要做的事情如下


1)給定的種子URLs,爬蟲(chóng)程序?qū)⑺蟹N子URL頁(yè)面爬取下來(lái)

2)爬蟲(chóng)程序解析爬取到的URL頁(yè)面中的鏈接,將這些鏈接放入待爬取URL集合中

3)重復(fù)1、2步,直到達(dá)到指定條件才結(jié)束爬取


因此,一個(gè)完整的爬蟲(chóng)大概是這樣子的:

import requests                       #用來(lái)爬取網(wǎng)頁(yè)
from bs4 import BeautifulSoup         #用來(lái)解析網(wǎng)頁(yè)
seds = ['http://www.hao123.com',      #我們的種子
              'http://www.csdn.net',
              'http://www.']
sum = 0                               #我們?cè)O(shè)定終止條件為:爬取到100000個(gè)頁(yè)面時(shí),就不玩了
 
while sum < 10000 :
    if sum < len(seds):
         r = requests.get(seds[sum])
         sum = sum   1
         do_save_action(r)
         soup = BeautifulSoup(r.content)               
         urls = soup.find_all('href',.....)                     //解析網(wǎng)頁(yè)
         for url in urls:
              seds.append(url)
 
    else:
         break

3.現(xiàn)在來(lái)找茬


上面那個(gè)完整的爬蟲(chóng),不足20行代碼,相信你能找出20個(gè)茬來(lái)。因?yàn)樗娜秉c(diǎn)實(shí)在是太多。下面一一列舉它的N宗罪:


1)我們的任務(wù)是爬取1萬(wàn)個(gè)網(wǎng)頁(yè),按上面這個(gè)程序,一個(gè)人在默默的爬取,假設(shè)爬起一個(gè)網(wǎng)頁(yè)3秒鐘,那么,爬一萬(wàn)個(gè)網(wǎng)頁(yè)需要3萬(wàn)秒鐘。MGD,我們應(yīng)當(dāng)考慮開(kāi)啟多個(gè)線程(池)去一起爬取,或者用分布式架構(gòu)去并發(fā)的爬取網(wǎng)頁(yè)。


2)種子URL和后續(xù)解析到的URL都放在一個(gè)列表里,我們應(yīng)該設(shè)計(jì)一個(gè)更合理的數(shù)據(jù)結(jié)構(gòu)來(lái)存放這些待爬取的URL才是,比如隊(duì)列或者優(yōu)先隊(duì)列。


3)對(duì)各個(gè)網(wǎng)站的url,我們一視同仁,事實(shí)上,我們應(yīng)當(dāng)區(qū)別對(duì)待。大站好站優(yōu)先原則應(yīng)當(dāng)予以考慮。


4)每次發(fā)起請(qǐng)求,我們都是根據(jù)url發(fā)起請(qǐng)求,而這個(gè)過(guò)程中會(huì)牽涉到DNS解析,將url轉(zhuǎn)換成ip地址。一個(gè)網(wǎng)站通常由成千上萬(wàn)的URL,因此,我們可以考慮將這些網(wǎng)站域名的IP地址進(jìn)行緩存,避免每次都發(fā)起DNS請(qǐng)求,費(fèi)時(shí)費(fèi)力。


5)解析到網(wǎng)頁(yè)中的urls后,我們沒(méi)有做任何去重處理,全部放入待爬取的列表中。事實(shí)上,可能有很多鏈接是重復(fù)的,我們做了很多重復(fù)勞動(dòng)。


6)…..


4.找了這么多茬后,很有成就感,真正的問(wèn)題來(lái)了,學(xué)挖掘機(jī)到底哪家強(qiáng)?


現(xiàn)在我們就來(lái)一一討論上面找茬找出的若干問(wèn)題的解決方案。


1)并行爬起問(wèn)題


我們可以有多重方法去實(shí)現(xiàn)并行。


多線程或者線程池方式,一個(gè)爬蟲(chóng)程序內(nèi)部開(kāi)啟多個(gè)線程。同一臺(tái)機(jī)器開(kāi)啟多個(gè)爬蟲(chóng)程序,如此,我們就有N多爬取線程在同時(shí)工作。能大大減少時(shí)間。


此外,當(dāng)我們要爬取的任務(wù)特別多時(shí),一臺(tái)機(jī)器、一個(gè)網(wǎng)點(diǎn)肯定是不夠的,我們必須考慮分布式爬蟲(chóng)。常見(jiàn)的分布式架構(gòu)有:主從(Master——Slave)架構(gòu)、點(diǎn)對(duì)點(diǎn)(Peer to Peer)架構(gòu),混合架構(gòu)等。


說(shuō)道分布式架構(gòu),那我們需要考慮的問(wèn)題就有很多,我們需要分派任務(wù),各個(gè)爬蟲(chóng)之間需要通信合作,共同完成任務(wù),不要重復(fù)爬取相同的網(wǎng)頁(yè)。分派任務(wù)我們要做到公平公正,就需要考慮如何進(jìn)行負(fù)載均衡。負(fù)載均衡,我們第一個(gè)想到的就是Hash,比如根據(jù)網(wǎng)站域名進(jìn)行hash。


負(fù)載均衡分派完任務(wù)之后,千萬(wàn)不要以為萬(wàn)事大吉了,萬(wàn)一哪臺(tái)機(jī)器掛了呢?原先指派給掛掉的哪臺(tái)機(jī)器的任務(wù)指派給誰(shuí)?又或者哪天要增加幾臺(tái)機(jī)器,任務(wù)有該如何進(jìn)行重新分配呢?


一個(gè)比較好的解決方案是用一致性Hash算法。


2)待爬取網(wǎng)頁(yè)隊(duì)列


如何對(duì)待待抓取隊(duì)列,跟操作系統(tǒng)如何調(diào)度進(jìn)程是類(lèi)似的場(chǎng)景。


不同網(wǎng)站,重要程度不同,因此,可以設(shè)計(jì)一個(gè)優(yōu)先級(jí)隊(duì)列來(lái)存放待爬起的網(wǎng)頁(yè)鏈接。如此一來(lái),每次抓取時(shí),我們都優(yōu)先爬取重要的網(wǎng)頁(yè)。

當(dāng)然,你也可以效仿操作系統(tǒng)的進(jìn)程調(diào)度策略之多級(jí)反饋隊(duì)列調(diào)度算法。


3)DNS緩存


為了避免每次都發(fā)起DNS查詢,我們可以將DNS進(jìn)行緩存。DNS緩存當(dāng)然是設(shè)計(jì)一個(gè)hash表來(lái)存儲(chǔ)已有的域名及其IP。


4)網(wǎng)頁(yè)去重


說(shuō)到網(wǎng)頁(yè)去重,第一個(gè)想到的是垃圾郵件過(guò)濾。垃圾郵件過(guò)濾一個(gè)經(jīng)典的解決方案是Bloom Filter(布隆過(guò)濾器)。布隆過(guò)濾器原理簡(jiǎn)單來(lái)說(shuō)就是:建立一個(gè)大的位數(shù)組,然后用多個(gè)Hash函數(shù)對(duì)同一個(gè)url進(jìn)行hash得到多個(gè)數(shù)字,然后將位數(shù)組中這些數(shù)字對(duì)應(yīng)的位置為1。下次再來(lái)一個(gè)url時(shí),同樣是用多個(gè)Hash函數(shù)進(jìn)行hash,得到多個(gè)數(shù)字,我們只需要判斷位數(shù)組中這些數(shù)字對(duì)應(yīng)的為是全為1,如果全為1,那么說(shuō)明這個(gè)url已經(jīng)出現(xiàn)過(guò)。如此,便完成了url去重的問(wèn)題。當(dāng)然,這種方法會(huì)有誤差,只要誤差在我們的容忍范圍之類(lèi),比如1萬(wàn)個(gè)網(wǎng)頁(yè),我只爬取到了9999個(gè),剩下那一個(gè)網(wǎng)頁(yè),who cares!


5)數(shù)據(jù)存儲(chǔ)的問(wèn)題


數(shù)據(jù)存儲(chǔ)同樣是個(gè)很有技術(shù)含量的問(wèn)題。用關(guān)系數(shù)據(jù)庫(kù)存取還是用NoSQL,抑或是自己設(shè)計(jì)特定的文件格式進(jìn)行存儲(chǔ),都大有文章可做。


6)進(jìn)程間通信


分布式爬蟲(chóng),就必然離不開(kāi)進(jìn)程間的通信。我們可以以規(guī)定的數(shù)據(jù)格式進(jìn)行數(shù)據(jù)交互,完成進(jìn)程間通信。


7)……


廢話說(shuō)了那么多,真正的問(wèn)題來(lái)了,問(wèn)題不是學(xué)挖掘機(jī)到底哪家強(qiáng)?而是如何實(shí)現(xiàn)上面這些東西?。海?/p>


實(shí)現(xiàn)的過(guò)程中,你會(huì)發(fā)現(xiàn),我們要考慮的問(wèn)題遠(yuǎn)遠(yuǎn)不止上面這些。紙上得來(lái)終覺(jué)淺,覺(jué)知此事要躬行!


來(lái)自:快課網(wǎng)
鏈接:http://www./3622.html


—————————————————

●本文編號(hào)465,以后想閱讀這篇文章直接輸入465即可。

●本文分類(lèi)“搜索引擎技術(shù)”,搜索分類(lèi)名可以獲得相關(guān)文章。

●輸入m可以獲取到全部文章目錄

●輸入r可以獲取到熱門(mén)文章推薦

●輸入f可以獲取到全部分類(lèi)名稱(chēng)

—————————————————

小猿個(gè)人微信:itcodemonkey 歡迎調(diào)戲


推薦一個(gè)微信公眾號(hào):IT電商網(wǎng),長(zhǎng)按下面的微信號(hào)可以進(jìn)行復(fù)制

itdianshang


點(diǎn)擊“閱讀原文”可關(guān)注


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多