你要统计一个网站有多少个链接,就需要去跑一个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次方左右,但是已经占了很大的内存。继续处理内存问题中。。。。。。。。。。。当然有个简单的办法,就是把他们 放到数据库里 ,但是 索引不是很好建的,因为,许多链接的差别往往是最后那几个字符。而且如果用多线程跑的话,还需要考虑 数据库线程池的问题。
可以把链接的存储做成一棵树。因为某一个网站的链接是有固定的规律的,一级目录,二级目录,甚至三级
代码如下:
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次方左右,但是已经占了很大的内存。继续处理内存问题中。。。。。。。。。。。当然有个简单的办法,就是把他们 放到数据库里 ,但是 索引不是很好建的,因为,许多链接的差别往往是最后那几个字符。而且如果用多线程跑的话,还需要考虑 数据库线程池的问题。