python网络爬虫磁盘缓存数据

import os
import re
import urllib.parse
import pickle

class DiskCache:
    def __init__(self,cache_dir='cache'):
        self.cache_dir=cache_dir

    def __getitem__(self, item):
        '''获取缓存'''
        path=self.url_to_path(item)
        if os.path.exists(path):
            with open(path,'wb')as fp:
                return pickle.load(fp)
        else:
            raise KeyError(url+' dose not exist!')

    def __setitem__(self, key, value):
        '''保存缓存'''
        path=self.url_to_path(key)
        folder=os.path.dirname(path)        #返回dirname目录
        if not os.path.exists(folder):      #没有父目录则创建父目录
            os.makedirs(folder)
        with open(path,'wb') as fp:         #写入子文件
            fp.write(pickle.dumps(value))

    def url_to_path(self,url):
        '''为url创建path'''
        components=urllib.parse.urlparse(url)
        path=components.path
        # 主要是避免特殊情况,可以视情况而定
        '''
        if not path:
            path='/start'                       #如果url没有path就创建一个
        elif path.endswith('/'):                
            path+='no_end'
        '''
        filename=components.netloc+path+components.query
        #替换文件名中的不合法部分
        filename=re.sub('[^/0-9a-zA-Z\-.,;_]','_',filename)
        filename='/'.join(segment[:255] for segment in filename.split('/'))#创建多级目录
        return os.path.join(self.cache_dir,filename)

#添加压缩减少磁盘占用,但是会加大一点查询时间,不过无关紧要
#在加一个缓存过期

import os
import re
import urllib.parse
import pickle
import zlib
import datetime
from datetime import timedelta

class DiskCache:
    def __init__(self,cache_dir='cache',expire=timedelta(days=30)):
        self.cache_dir=cache_dir
        self.expire=expire

    def __getitem__(self, item):
        '''获取缓存'''
        path=self.url_to_path(item)
        if os.path.exists(path):
            with open(path,'wb')as fp:
                result,time=pickle.load(zlib.decompress(fp.read()))
                if self.has_expire(time):
                    raise KeyError(url+' has expired!')
                return result
        else:
            raise KeyError(url+' dose not exist!')

    def __setitem__(self, key, value):
        '''保存缓存'''
        path=self.url_to_path(key)
        folder=os.path.dirname(path)        #返回dirname目录
        if not os.path.exists(folder):      #没有父目录则创建父目录
            os.makedirs(folder)
        time=datetime.datetime.utcnow()
        with open(path,'wb') as fp:         #写入子文件
            fp.write(zlib.compress(pickle.dumps(value,time)))

    def has_expire(self,timestamp):
        return datetime.datetime.utcnow()>timestamp+self.expire

    def url_to_path(self,url):
        '''为url创建path'''
        components=urllib.parse.urlparse(url)
        path=components.path
        # 主要是避免特殊情况,可以视情况而定
        '''
        if not path:
            path='/start'                       #如果url没有path就创建一个
        elif path.endswith('/'):                
            path+='no_end'
        '''
        filename=components.netloc+path+components.query
        #替换文件名中的不合法部分
        filename=re.sub('[^/0-9a-zA-Z\-.,;_]','_',filename)
        filename='/'.join(segment[:255] for segment in filename.split('/'))#创建多级目录
        return os.path.join(self.cache_dir,filename)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值