乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       corefashion 2014-10-25

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


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


      1.世界上最簡單的爬蟲——三行情詩


      我們先來看一個最簡單的最簡單的爬蟲,用python寫成,只需要三行。

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

      上面這三行爬蟲程序,就如下面這三行情詩一般,很干脆利落。


      是好男人,

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

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


      2.一個正常的爬蟲程序


      上面那個最簡單的爬蟲,是一個不完整的殘疾的爬蟲。因為爬蟲程序通常需要做的事情如下


      1)給定的種子URLs,爬蟲程序?qū)⑺蟹N子URL頁面爬取下來

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

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


      因此,一個完整的爬蟲大概是這樣子的:

      import requests                       #用來爬取網(wǎng)頁
      from bs4 import BeautifulSoup         #用來解析網(wǎng)頁
      seds = ['http://www.hao123.com',      #我們的種子
                    'http://www.csdn.net',
                    'http://www.']
      sum = 0                               #我們設(shè)定終止條件為:爬取到100000個頁面時,就不玩了
       
      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)頁
               for url in urls:
                    seds.append(url)
       
          else:
               break

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


      上面那個完整的爬蟲,不足20行代碼,相信你能找出20個茬來。因為它的缺點實在是太多。下面一一列舉它的N宗罪:


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


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


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


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


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


      6)…..


      4.找了這么多茬后,很有成就感,真正的問題來了,學(xué)挖掘機到底哪家強?


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


      1)并行爬起問題


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


      多線程或者線程池方式,一個爬蟲程序內(nèi)部開啟多個線程。同一臺機器開啟多個爬蟲程序,如此,我們就有N多爬取線程在同時工作。能大大減少時間。


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


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


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


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


      2)待爬取網(wǎng)頁隊列


      如何對待待抓取隊列,跟操作系統(tǒng)如何調(diào)度進程是類似的場景。


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

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


      3)DNS緩存


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


      4)網(wǎng)頁去重


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


      5)數(shù)據(jù)存儲的問題


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


      6)進程間通信


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


      7)……


      廢話說了那么多,真正的問題來了,問題不是學(xué)挖掘機到底哪家強?而是如何實現(xiàn)上面這些東西?。海?/p>


      實現(xiàn)的過程中,你會發(fā)現(xiàn),我們要考慮的問題遠遠不止上面這些。紙上得來終覺淺,覺知此事要躬行!


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


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

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

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

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

      ●輸入r可以獲取到熱門文章推薦

      ●輸入f可以獲取到全部分類名稱

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

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


      推薦一個微信公眾號:IT電商網(wǎng),長按下面的微信號可以進行復(fù)制

      itdianshang


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


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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多