一个查找的问题

你要统计一个网站有多少个链接,就需要去跑一个spider,里边 有个链接重复的问题,你需要判断是否存在,正常的算法,是便利一遍你已经得导的链接列表,小量数据木有问题,大量的话就慢了。
         可以把链接的存储做成一棵树。因为某一个网站的链接是有固定的规律的,一级目录,二级目录,甚至三级

代码如下:

class urlDetail:
    '''链接信息'''
    def __init__(self,url):
        self.url = url
        detail = urlparse(url)
        self.domain = detail.netloc
        self.path = detail.path
        self.query = detail.query
    def isInDomain(self):
        return True
    def getPathList(self):
        pathList = [self.domain,]
        paths = self.path.strip('/').split('/')
        for p in paths:
            pathList.append(p)
        if self.query!='':
            pathList.append(self.query)
        return pathList
    def getBaseUrl(self):
        return 'http://%s'%(self.domain,)
    def getCurrentUrl(self):
        return 'http://%s%s'%(self.domain,self.path)

class myUrl:
    '''一个url单元'''
    def __init__(self,url):
        self.url = url
        detail = urlDetail(url)
        self.path = detail.getPathList()
        self.query = detail.query

class dataBase:
    '''一棵简单的树,采用字典的key作为指针,
    因为一个url是以/分割的系列数据,
    所以这样存储查询起来要块的多'''
    def __init__(self):
        self.unit = {}
        self.data = {}


    def addData(self,myUrl):
        ''''''
        node = self.data
        k = len(myUrl.path)
        for p in myUrl.path:
            if node.has_key(p):
                node = node[p]
            else:
                node[p] = {}
                node = node[p]
            k = k-1
            if k==0:
                node['hit'] = ''
    def findData(self,myUrl):
        '''查找树'''
        node = self.data
        k = len(myUrl.path)
        for p in myUrl.path:
            if node.has_key(p):
                node = node[p]
                k = k-1
                if k==0:
                    if node.has_key('hit'):
                        return True
                    else:
                        return False
            else:
                return False
        return True
    def delData(self,data):
        ''''''
 

经测试 数据到70W的时候查询时间还在-5次方左右,但是已经占了很大的内存。继续处理内存问题中。。。。。。。。。。。当然有个简单的办法,就是把他们 放到数据库里 ,但是 索引不是很好建的,因为,许多链接的差别往往是最后那几个字符。而且如果用多线程跑的话,还需要考虑 数据库线程池的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值