自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

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

  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.     #獲取數(shù)據(jù)  
  31.     data = xxxx  
  32.     return data 

func_top是上層頁面的處理函數(shù),func_sub是子頁面的處理函數(shù),func_bottom是最深層頁面的處理函數(shù),func_top會在取到子頁面url后遍歷調(diào)用func_sub,func_sub也是同樣。

如果正常情況下,這樣確實已經(jīng)滿足需求了,但是偏偏這個你要抓取的網(wǎng)站可能極不穩(wěn)定,經(jīng)常鏈接不上,導致數(shù)據(jù)拿不到。

于是這個時候你有兩個選擇:

◆ 1. 遇到錯誤就停止,之后重新從斷掉的位置開始重新跑

◆ 2. 遇到錯誤繼續(xù),但是要在之后重新跑一遍,這個時候已經(jīng)有的數(shù)據(jù)不希望再去網(wǎng)站拉一次,而只去拉沒有取到的數(shù)據(jù)

對第一種方案基本無法實現(xiàn),因為如果別人網(wǎng)站的url調(diào)整順序,那么你記錄的位置就無效了。那么只有第二種方案,說白了,就是要把已經(jīng)拿到的數(shù)據(jù)cache下來,等需要的時候,直接從cache里面取。

OK,目標已經(jīng)有了,怎么實現(xiàn)呢?

如果是在C++中的,這是個很麻煩的事情,而且寫出來的代碼必定丑陋無比,然而慶幸的是,我們用的是Python,而Python對函數(shù)有裝飾器。

所以實現(xiàn)方案也就有了:

定義一個裝飾器,如果之前取到數(shù)據(jù),就直接取cache的數(shù)據(jù);如果之前沒有取到,那么就從網(wǎng)站拉取,并且存入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數(shù)據(jù),所以比如某個sub層數(shù)據(jù)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函數(shù)幫助查詢小工具
  4. 巧用IronPython做更靈活的網(wǎng)頁爬蟲
  5. 一個Python程序員的進化
責任編輯:陳貽新 來源: Vim
相關推薦

2019-11-25 14:05:47

Python裝飾器數(shù)據(jù)

2023-12-21 14:40:09

Python編程語言

2014-01-22 16:19:06

游戲圈游戲創(chuàng)業(yè)移動游戲

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2019-11-29 16:49:42

HTML語言開發(fā)

2024-05-20 09:27:00

Web 開發(fā)CSS

2011-09-15 17:10:41

2022-10-13 11:48:37

Web共享機制操作系統(tǒng)

2009-12-10 09:37:43

2021-02-01 23:23:39

FiddlerCharlesWeb

2015-09-16 10:48:57

Python

2020-01-29 19:40:36

Python美好,一直在身邊Line

2021-01-05 11:22:58

Python字符串代碼

2022-04-14 09:01:19

CSS父選擇器CSS類

2009-04-14 21:38:05

LinuxUbuntu技巧

2023-07-07 14:47:46

JavaScript技巧

2023-05-22 15:37:31

CSS元素JavaScript

2010-08-23 09:56:09

Java性能監(jiān)控

2022-04-30 19:22:35

Python編程語言
點贊
收藏

51CTO技術棧公眾號