简介:在爬虫运行时容易产生反复爬取页面的情况,以下代码为了避免重复爬取生成一个url管理器作为一个模块使用。
class UrlManager():
def __init__(self): # 初始化函数
self.new_urls = set() # 定义一个新的待爬取的
self.old_urls = set() # 定义一个已经待爬取的url
def add_new_url(self, url): # 新增一个url
if url is None or len(url) == 0: # 判断一个url是否合格
return
if url in self.new_urls or url in self.old_urls: # 判断这个url是否在新或老的容器里面
return
self.new_urls.add(url)
def add_new_urls(self, urls): # 批量添加url
if urls is None or len(urls) == 0: # 判断一个url是否合格
return
for url in urls:
self.add_new_url(url)
def get_url(self): # 获取一个待爬取的url
if self.has_new_url(): # 判断这个容器中有待爬取的rul
url = self.new_urls.pop()
self.old_urls.add(url)
return
else:
return None
def has_new_url(self): # 判断一个容器里面有没有待爬取的url
return len(self.new_urls) > 0
if __name__ == "__main__":
url_manger = UrlManager()
url_manger.add_new_url("url1")
url_manger.add_new_urls(["url1", "url2"])
print(url_manger.new_urls, url_manger.old_urls)
print("#"*30)
new_url = url_manger.get_url()
print(url_manger.new_urls, url_manger.old_urls)
print("#"*30)
new_url = url_manger.get_url()
print(url_manger.new_urls, url_manger.old_urls)
print("#"*30)
print(url_manger.has_new_url())