- 1.前述
- 2.结构分层
- 2.1两个集合
- 2.2 主要方法
- 3.全部代码
在爬虫中需要对URL进行处理,统一管理URL,方便使用URL。
2.结构分层 2.1两个集合定义两个集合放在类的初始化方法中,选择集合这个数据类型,是因为集合的天然去重性,在同一个集合中不会出现一样的数据。
这两个集合分别时:未爬取的URL集合,已爬取的URL集合
用来存储没有爬取过数据的URL和已经爬取过数据的URL,为防止重复爬取同一个URL的数据。
def __init__(self):
self.new_urls = set() # 未爬取的URL集合
self.old_urls = set() # 已爬取的URL集合
2.2 主要方法
- 获取未爬取URL集合的大小
def new_url_size(self):
'''
获取未爬取URL集合的大小
:return: 新的URL集合的大小
'''
return len(self.new_urls) # 返回未爬取的URL集合的大小
- 获取已爬取URL的大小
def old_url_size(self):
'''
获取已爬取URL的大小
:return: 旧的URL的大小
'''
return len(self.old_urls) # 返回已爬取的URL集合的大小
- 判断是否有未爬取的URL
判断未爬取的URL集合中还有没有URL,如果有返回Ture,否则返回False
def has_new_url(self):
'''
判断是否有未爬取的URL
:return:true or false
'''
return self.new_url_size() != 0 # 返回判断后的真假
- 获取一个未爬取的URL
def get_new_url(self):
'''
获取一个未爬取的URL
:return: 一个新的URL
'''
new_url = self.new_urls.pop() # 从未爬取的URL集合中获取一个URL并且从原集合中删除
self.old_urls.add(new_url) # 把这条URL放入已爬取的URL集合中
return new_url # 返回这条URL
- 将新的URL添加到未爬取的URL集合
下面是添加一个URL链接到未爬取的URL集合
def add_new_url(self,url):
'''
将新的URL添加到未爬取的URL集合
:param url: 单个URL
:return: 没有
'''
if url is None:
return
if url not in self.new_urls and url not in self.old_urls: # 判断URL是否在未爬取的URL集合和已爬取的URL集合中
self.new_urls.add(url) # 若不在就加入未爬取的URL集合中
下面是添加多个URL链接到未爬取的URL集合
def add_new_urls(self,urls):
'''
将新的URL添加到未爬取的URL集合
:param urls: URL集合
:return: 没有
'''
if urls is None or len(urls) == 0:
return
for url in urls:
self.add_new_url(url) # 调用添加单个URL的方法
3.全部代码
# URL管理器
class URLManager(object):
def __init__(self):
self.new_urls = set() # 未爬取的URL集合
self.old_urls = set() # 已爬取的URL集合
def new_url_size(self):
'''
获取未爬取URL集合的大小
:return: 新的URL集合的大小
'''
return len(self.new_urls) # 返回未爬取的URL集合的大小
def old_url_size(self):
'''
获取已爬取URL的大小
:return: 旧的URL的大小
'''
return len(self.old_urls) # 返回已爬取的URL集合的大小
def has_new_url(self):
'''
判断是否有未爬取的URL
:return:true or false
'''
return self.new_url_size() != 0 # 返回判断后的真假
def get_new_url(self):
'''
获取一个未爬取的URL
:return: 一个新的URL
'''
new_url = self.new_urls.pop() # 从未爬取的URL集合中获取一个URL并且从原集合中删除
self.old_urls.add(new_url) # 把这条URL放入已爬取的URL集合中
return new_url # 返回这条URL
def add_new_url(self,url):
'''
将新的URL添加到未爬取的URL集合
:param url: 单个URL
:return: 没有
'''
if url is None:
return
if url not in self.new_urls and url not in self.old_urls: # 判断URL是否在未爬取的URL集合和已爬取的URL集合中
self.new_urls.add(url) # 若不在就加入未爬取的URL集合中
def add_new_urls(self,urls):
'''
将新的URL添加到未爬取的URL集合
:param urls: URL集合
:return: 没有
'''
if urls is None or len(urls) == 0:
return
for url in urls:
self.add_new_url(url) # 调用添加单个URL的方法



