URL 管理器是爬虫过程中重要的一环,使用它来管理在爬虫过程中众多的 URL 地址以免造成重复获取爬虫地址、爬虫 陷入死循环等情况的发生。比如,我们要根据 baidu.com 来进行爬虫,如果在爬虫的子页面中也包含 baidu.com 不做处理的话就会陷入循环,所以说,在爬虫过程中对 URL 进行很好的维护是非常重要的。
前往 >> 【阅读全文】
1、创建 url 管理对象及属性定义
1# 导入队列
2fromcollectionsimportdeque
3
4# 定义 url 管理器类
5classurl_queue():
6def__init__(self):
7# 定义待爬取的队列
8self.queue = deque()
9# 定义已经爬取的集合,使用 set 集合保证去重
10self.set = set()
2、将页面上获取到的 url 添加到没有爬取的队列
1defadd_nocrawl_url(self,url):
2'''
3:return: 将爬取的新的 url 添加到未爬取队列
4'''
5# 校验 url 是否为 None
6ifurlisNone:
7# 返回 False
8returnFalse
9# 校验 url 是否已经存在在已经爬取或未被爬取的集合
10elifurlnotinself.queueandurlnotinself.set:
11# 若不存在时,则将该条新的 url 添加到未被爬取的队列中
12self.queue.append(url)
13# 返回 True
14returnTrue
3、获取一条 url 进行下一次爬虫
1defget_nocrawl_url(self):
2'''
3:return: 获取一个未爬取的 url
4'''
5# 取出一个没有爬取的 url
6nocrawl_url = self.queue.popleft()
7# 将未爬取的 url 添加到已经爬取的 url 集合中
8self.set.add(nocrawl_url)
9returnnocrawl_url
4、获取未爬取或已经爬取的 url 长度
1defget_nocrawl_size(self):
2'''
3:return: 获取待爬取的队列长度
4'''
5nocrawl_size = len(self.queue)
6returnnocrawl_size
7
8defget_crawl_size(self):
9'''
10:return: 获取已爬取的集合长度
11'''
12crawl_size = len(self.set)
13returncrawl_size
14
15defis_nocrawl(self):
16'''
17:return: 是否存在未爬取的 url
18'''
19ifself.get_nocrawl_size() <=0:
20returnFalse
21else:
22returnTrue