成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你不知道的 Python裝飾器的一個妙用

開發 前端 后端
定義Python一個裝飾器,如果之前取到數據,就直接取cache的數據;如果之前沒有取到,那么就從網站拉取,并且存入cache中.

好吧,我知道是大半夜……,但我還是覺得趕緊花上半個小時,把這最新的想法分享出來是值得的~直接進入正題~

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

  1. def func_top(url):  
  2.     data_dict= {}  
  3.    
  4.     #在頁面上獲取到子url  
  5.     sub_urls = xxxx  
  6.    
  7.     data_list = []  
  8.     for it in sub_urls:  
  9.         data_list.append(func_sub(it))  
  10.    
  11.     data_dict['data'] = data_list  
  12.    
  13.     return data_dict  
  14.    
  15. def func_sub(url):  
  16.     data_dict= {}  
  17.    
  18.     #在頁面上獲取到子url  
  19.     bottom_urls = xxxx  
  20.    
  21.     data_list = []  
  22.     for it in bottom_urls:  
  23.         data_list.append(func_bottom(it))  
  24.    
  25.     data_dict['data'] = data_list  
  26.    
  27.     return data_dict  
  28.    
  29. def func_bottom(url):  
  30.     #獲取數據  
  31.     data = xxxx  
  32.     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中.

代碼如下:

  1. def get_dump_data(dir_name, url):  
  2.     m = hashlib.md5(url)  
  3.     filename = m.hexdigest()  
  4.     full_file_name = 'dumps/%s/%s' % (dir_name,filename)  
  5.    
  6.     if os.path.isfile(full_file_name):  
  7.         return eval(file(full_file_name,'r').read())  
  8.     else:  
  9.         return None 
  10.    
  11.    
  12. def set_dump_data(dir_name, url, data):  
  13.     if not os.path.isdir('dumps/'+dir_name):  
  14.         os.makedirs('dumps/'+dir_name)  
  15.    
  16.     m = hashlib.md5(url)  
  17.     filename = m.hexdigest()  
  18.     full_file_name = 'dumps/%s/%s' % (dir_name,filename)  
  19.    
  20.     f = file(full_file_name, 'w+')  
  21.     f.write(repr(data))  
  22.     f.close()  
  23.    
  24.    
  25. def deco_dump_data(func):  
  26.     def func_wrapper(url):  
  27.         data = get_dump_data(func.__name__,url)  
  28.         if data is not None:  
  29.             return data  
  30.    
  31.         data = func(url)  
  32.         if data is not None:  
  33.             set_dump_data(func.__name__,url,data)  
  34.         return data  
  35.    
  36.     return func_wrapper 

然后,我們只需要在每個func_top,func_sub,func_bottom都加上deco_dump_data這個裝飾器即可~~

搞定!這樣做最大的好處在于,因為top,sub,bottom,每一層都會dump數據,所以比如某個sub層數據dump之后,是根本不會走到他所對應的bottom層的,減少了大量的開銷!

OK,就這樣~ 人生苦短,我用Python!

原文鏈接:http://www.vimer.cn/2011/04/python%E8%A3%85%E9%A5%B0%E5%99%A8%E7%9A%84%E4%B8%80%E4%B8%AA%E5%A6%99%E7%94%A8.html

【編輯推薦】

  1. Python編輯利器:PyCharm初探
  2. 淺析Python中的列表解析和生成表達式
  3. 自制Python函數幫助查詢小工具
  4. 巧用IronPython做更靈活的網頁爬蟲
  5. 一個Python程序員的進化
責任編輯:陳貽新 來源: Vim
相關推薦

2019-11-25 14:05:47

Python裝飾器數據

2023-12-21 14:40:09

Python編程語言

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2014-01-22 16:19:06

游戲圈游戲創業移動游戲

2010-08-23 09:56:09

Java性能監控

2024-05-20 09:27:00

Web 開發CSS

2019-11-29 16:49:42

HTML語言開發

2023-08-14 15:56:52

CSS 偽元素開發

2011-09-15 17:10:41

2021-02-01 23:23:39

FiddlerCharlesWeb

2009-12-10 09:37:43

2022-10-13 11:48:37

Web共享機制操作系統

2010-10-19 15:31:44

Java

2019-08-09 14:20:46

微信軟件手機

2020-01-29 19:40:36

Python美好,一直在身邊Line

2021-01-05 11:22:58

Python字符串代碼

2018-04-26 13:33:20

Python語法Bug

2015-09-16 10:48:57

Python

2021-10-17 13:10:56

函數TypeScript泛型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天操网 | 超碰日韩 | 国产精品久久久久久一级毛片 | 中文一区 | 国产高清视频 | 欧美a级成人淫片免费看 | 国产乱码精品一区二区三区中文 | 亚洲高清视频一区二区 | 久久久久国产 | 色偷偷噜噜噜亚洲男人 | 国产激情免费视频 | 国产91丝袜在线熟 | 久久亚洲欧美日韩精品专区 | 亚洲精品视频在线播放 | 操射视频| 色五月激情五月 | 成人精品视频在线观看 | 美女黄色在线观看 | 高清成人免费视频 | 久久33| 国产激情三区 | 国际精品鲁一鲁一区二区小说 | www.久久久久久久久 | 精品国产乱码久久久久久88av | 午夜免费视频 | 亚洲少妇综合网 | 国产免费观看视频 | 精品国产18久久久久久二百 | 欧美日韩一区在线观看 | 亚洲国产成人精品女人久久久 | 正在播放国产精品 | 91九色porny首页最多播放 | 精品国产一区二区三区久久 | 亚洲天堂一区二区 | 国产区在线观看 | 日本三级日产三级国产三级 | 欧美一级免费看 | 免费视频一区 | 97精品超碰一区二区三区 | 国产精品精品视频一区二区三区 | 国产精品国产三级国产aⅴ无密码 |