Python爬虫URL管理器实现:基于deque的去重与防循环机制

苏见山
苏见山
发布时间:2026-10-13 | 2人浏览过
原创

本文详解Python爬虫中URL管理器的实现方法,重点解析如何利用collections模块中的deque双向队列高效维护待抓取与已抓取URL集合。通过示例代码展示如何判断URL存在性、执行去重逻辑及防止页面跳转死循环,为构建稳定爬虫系统提供核心组件参考。

本文深入解析Python爬虫框架中URL管理器模块的具体用法,通过详细的代码示例帮助读者理解其核心逻辑,对实际开发或学习具有明确的参考价值。

URL管理器模块概述

URL管理器模块

URL状态维护与防循环机制

该模块的核心职责是维护待抓取URL、已抓取URL以及新发现URL的状态。其关键机制在于:当检测到当前待抓取URL已存在于队列中时,直接跳过以避免重复爬取;同时,通过状态追踪有效防止爬虫陷入无限循环。

以抓取www.baidu.com为例,若从该页面提取到music.baidu.com链接并继续深入抓取,而新页面又包含www.baidu.com的链接,若不进行状态管理,爬虫将在百度首页与音乐页之间无限跳转,形成死循环。因此,使用队列机制严格管理URL状态至关重要。

基于deque的代码实现

以下Python代码示例展示了具体实现方式,主要利用deque双向队列来高效处理URL的进出操作,便于快速获取和处理历史URL数据。


from collections import deque
class URLQueue():
  def __init__(self):
    self.queue = deque() # 待抓取的网页
    self.visited = set() # 已经抓取过的网页
 
  def new_url_size(self):
    '''''
    获取未爬取URL集合的大小
    :return: 
    '''
    return len(self.queue)
 
  def old_url_size(self):
    '''''
    获取已爬取URL的大小
    :return: 
    '''
    return len(self.visited)
 
  def has_new_url(self):
    '''''
    判断是否有未爬取的URL
    :return: 
    '''
    return self.new_url_size() != 0
 
  def get_new_url(self):
    '''''
    获取一个未爬取的URL
    :return: 
    '''
    new_url = self.queue.popleft()#从左侧取出一个链接
    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 False
    if url not in self.new_urls and url not in self.old_urls:
      self.new_urls.append(url)
 
  def add_new_urls(self, urlset):
    '''''
    将新的URL添加到未爬取的URL集合
    :param urlset: url集合
    :return: 
    '''
    if urlset is None or len(urlset) == 0:
      return
    for url in urlset:
       self.add_new_url(url)

以上为本文关于Python爬虫URL管理器模块的全部内容,希望能为读者的学习与工作提供有益帮助,欢迎继续支持本站获取更多技术资源。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表