文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
6.2 URL 管理器
URL管理器主要包括两个变量,一个是已爬取URL的集合,另一个是未爬取URL的集合。采用Python中的set类型,主要是使用set的去重复功能,防止链接重复爬取,因为爬取链接重复时容易造成死循环。链接去重复在Python爬虫开发中是必备的功能,解决方案主要有三种:1)内存去重2)关系数据库去重3)缓存数据库去重。大型成熟的爬虫基本上采用缓存数据库的去重方案,尽可能避免内存大小的限制,又比关系型数据库去重性能高很多。由于基础爬虫的爬取数量较小,因此我们使用Python中set这个内存去重方式。
URL管理器除了具有两个URL集合,还需要提供以下接口,用于配合其他模块使用,接口如下:
·判断是否有待取的URL,方法定义为has_new_url()。
·添加新的URL到未爬取集合中,方法定义为add_new_url(url),add_new_urls(urls)。
·获取一个未爬取的URL,方法定义为get_new_url()。
·获取未爬取URL集合的大小,方法定义为new_url_size()。
·获取已经爬取的URL集合的大小,方法定义为old_url_size()。
程序URLManager.py的完整代码如下:
# coding:utf-8 class UrlManager(object): def __init__(self): self.new_urls = set()# 未爬取URL集合 self.old_urls = set()# 已爬取URL集合 def has_new_url(self): ''' 判断是否有未爬取的URL :return: ''' return self.new_url_size()!=0 def get_new_url(self): ''' 获取一个未爬取的URL :return: ''' new_url = self.new_urls.pop() self.old_urls.add(new_url) return new_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: self.new_urls.add(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) def new_url_size(self): ''' 获取未爬取URL集合的大小 :return: ''' return len(self.new_urls) def old_url_size(self): ''' 获取已经爬取URL集合的大小 :return: ''' return len(self.old_urls)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论