<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        進一步探究Python的裝飾器的運用

        來源:懂視網 責編:小采 時間:2020-11-27 14:41:38
        文檔

        進一步探究Python的裝飾器的運用

        進一步探究Python的裝飾器的運用:裝飾器在 python 中用的相當廣泛,如果你用過 python 的一些 web 框架,那么一定對其中的 route() 裝飾器 不陌生,今天咱們再看一個具體的案例。 咱們來模擬一個場景,需要你去抓去一個頁面,然后這個頁面有好多url也要分別去抓取,而進入這些子url后
        推薦度:
        導讀進一步探究Python的裝飾器的運用:裝飾器在 python 中用的相當廣泛,如果你用過 python 的一些 web 框架,那么一定對其中的 route() 裝飾器 不陌生,今天咱們再看一個具體的案例。 咱們來模擬一個場景,需要你去抓去一個頁面,然后這個頁面有好多url也要分別去抓取,而進入這些子url后

        裝飾器在 python 中用的相當廣泛,如果你用過 python 的一些 web 框架,那么一定對其中的 “ route() 裝飾器” 不陌生,今天咱們再看一個具體的案例。

        咱們來模擬一個場景,需要你去抓去一個頁面,然后這個頁面有好多url也要分別去抓取,而進入這些子url后,還有數據要抓取。簡單點,我們就按照三層來看,那我們的代碼就是如下:

        def func_top(url):
         data_dict= {}
         
         #在頁面上獲取到子url
         sub_urls = xxxx
         
         data_list = []
         for it in sub_urls:
         data_list.append(func_sub(it))
         
         data_dict['data'] = data_list
         
         return data_dict
         
        def func_sub(url):
         data_dict= {}
         
         #在頁面上獲取到子url
         bottom_urls = xxxx
         
         data_list = []
         for it in bottom_urls:
         data_list.append(func_bottom(it))
         
         data_dict['data'] = data_list
         
         return data_dict
         
        def func_bottom(url):
         #獲取數據
         data = xxxx
         return data
        

        func_top是上層頁面的處理函數,func_sub是子頁面的處理函數,func_bottom是最深層頁面的處理函數,func_top會在取到子頁面url后遍歷調用func_sub,func_sub也是同樣。
        如果正常情況下,這樣確實已經滿足需求了,但是偏偏這個你要抓取的網站可能極不穩定,經常鏈接不上,導致數據拿不到。
        于是這個時候你有兩個選擇:
        1.遇到錯誤就停止,之后重新從斷掉的位置開始重新跑
        2.遇到錯誤繼續,但是要在之后重新跑一遍,這個時候已經有的數據不希望再去網站拉一次,而只去拉沒有取到的數據
        對第一種方案基本無法實現,因為如果別人網站的url調整順序,那么你記錄的位置就無效了。那么只有第二種方案,說白了,就是要把已經拿到的數據cache下來,等需要的時候,直接從cache里面取。
        OK,目標已經有了,怎么實現呢?
        如果是在C++中的,這是個很麻煩的事情,而且寫出來的代碼必定丑陋無比,然而慶幸的是,我們用的是python,而python對函數有裝飾器。
        所以實現方案也就有了:
        定義一個裝飾器,如果之前取到數據,就直接取cache的數據;如果之前沒有取到,那么就從網站拉取,并且存入cache中.
        代碼如下:

        import os
        import hashlib
         
        def deco_args_recent_cache(category='dumps'):
         '''
         裝飾器,返回最新cache的數據
         '''
         def deco_recent_cache(func):
         def func_wrapper(*args, **kargs):
         sig = _mk_cache_sig(*args, **kargs)
         data = _get_recent_cache(category, func.__name__, sig)
         if data is not None:
         return data
         
         data = func(*args, **kargs)
         if data is not None:
         _set_recent_cache(category, func.__name__, sig, data)
         return data
         
         return func_wrapper
         
         return deco_recent_cache
         
        def _mk_cache_sig(*args, **kargs):
         '''
         通過傳入參數,生成唯一標識
         '''
         src_data = repr(args) + repr(kargs)
         m = hashlib.md5(src_data)
         sig = m.hexdigest()
         return sig
         
        def _get_recent_cache(category, func_name, sig):
         full_file_path = '%s/%s/%s' % (category, func_name, sig)
         if os.path.isfile(full_file_path):
         return eval(file(full_file_path,'r').read())
         else:
         return None
         
        def _set_recent_cache(category, func_name, sig, data):
         full_dir_path = '%s/%s' % (category, func_name)
         if not os.path.isdir(full_dir_path):
         os.makedirs(full_dir_path)
         
         full_file_path = '%s/%s/%s' % (category, func_name, sig)
         f = file(full_file_path, 'w+')
         f.write(repr(data))
         f.close()
        

        然后,我們只需要在每個func_top,func_sub,func_bottom都加上deco_args_recent_cache這個裝飾器即可~~
        搞定!這樣做最大的好處在于,因為top,sub,bottom,每一層都會dump數據,所以比如某個sub層數據dump之后,是根本不會走到他所對應的bottom層的,減少了大量的開銷!
        OK,就這樣~ 人生苦短,我用python!

        注:

        python3 已經原生支持了這種功能!鏈接如下:

        http://docs.python.org/py3k/whatsnew/3.2.html#functools

        推薦閱讀:

        https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        進一步探究Python的裝飾器的運用

        進一步探究Python的裝飾器的運用:裝飾器在 python 中用的相當廣泛,如果你用過 python 的一些 web 框架,那么一定對其中的 route() 裝飾器 不陌生,今天咱們再看一個具體的案例。 咱們來模擬一個場景,需要你去抓去一個頁面,然后這個頁面有好多url也要分別去抓取,而進入這些子url后
        推薦度:
        標簽: 使用 python python的
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久精品毛片免费观看| 亚洲第一成年人网站| 亚洲日本一线产区和二线| 波多野结衣在线免费视频 | 成a人片亚洲日本久久| 一个人免费高清在线观看| 亚洲精品中文字幕乱码影院| 美女内射毛片在线看免费人动物| 97久久精品亚洲中文字幕无码| 日本xxxx色视频在线观看免费| 亚洲色偷偷av男人的天堂| 久久久高清免费视频| 亚洲熟妇av午夜无码不卡| 国产在线19禁免费观看国产 | 国产精品福利片免费看| 亚洲男人第一无码aⅴ网站| 国产VA免费精品高清在线| 久久久青草青青亚洲国产免观| 成全视频免费观看在线看| 免费无码又爽又刺激毛片| 丰满亚洲大尺度无码无码专线 | 亚洲最大AV网站在线观看| 免费在线观影网站| 亚洲综合亚洲国产尤物| 在线免费观看污网站| 一级黄色毛片免费看| 久久亚洲熟女cc98cm| 日韩a在线观看免费观看| 男女男精品网站免费观看| 无码乱人伦一区二区亚洲一| 成人性生活免费视频| 国产99久久久国产精免费| 亚洲国产韩国一区二区| 免费在线黄色网址| 最近中文字幕2019高清免费| 香蕉视频亚洲一级| 亚洲大片在线观看| 国产大片51精品免费观看| 99re6在线精品视频免费播放| 色综合久久精品亚洲国产| 亚洲国产日韩一区高清在线|