递归式Web爬虫开发故障排查:层级URL抓取逻辑问题求助
问题分析
你的递归爬虫没达到预期效果,核心问题出在几个关键逻辑上:
- 计数器传递错误:你把递减后的
count传给了下一层递归,导致每深入一层,可抓取的URL数量就越来越少,而不是每层都保持固定的count个。 - 参数混用:
newtags = tags[:depth]用深度参数depth来截取链接数量,完全搞反了depth(爬取层数)和count(每层抓取数量)的用途。 - 缺少递归终止条件:没有判断深度是否耗尽,会导致递归无限制进行,无法在指定深度停止。
- 无效过滤判断:
"http" in url应该检查新抓取的url3,而非原URL,这会导致错误过滤掉有效链接。
修正后的代码
from bs4 import BeautifulSoup import requests def extractURL(url, current_depth, max_depth, count_per_level): # 递归终止:当前深度超过最大允许深度则停止 if current_depth > max_depth: return try: # 发送请求并处理异常 response = requests.get(url, timeout=5) response.raise_for_status() soup = BeautifulSoup(response.text, 'lxml') tags = soup.find_all('a') valid_urls = [] # 先收集所有符合要求的HTTP/HTTPS链接 for link in tags: url2 = link.get('href') if url2 and url2.startswith(("http://", "https://")): valid_urls.append(url2) # 只取每层需要的指定数量链接 target_urls = valid_urls[:count_per_level] # 打印层级关联关系 for url3 in target_urls: print(f"{url} -> {url3}") print("----------------") # 递归调用:深度+1,保持每层抓取数量不变 extractURL(url3, current_depth + 1, max_depth, count_per_level) except requests.exceptions.RequestException as e: print(f"请求{url}失败: {e}") # 配置爬虫参数 initial_url = 'http://www.baidu.com' max_depth = 3 # 总共爬3层(初始URL为第1层) count_per_level = 3 # 每层抓取3个URL # 启动爬虫,初始深度设为1 extractURL(initial_url, 1, max_depth, count_per_level) print("Done")
关键修改说明
- 分离深度参数:把当前深度
current_depth和最大深度max_depth分开,每次递归时深度+1,超过最大值就终止,精准控制爬取层数。 - 固定每层抓取数量:递归时传递原始的
count_per_level,而非递减后的数值,确保每层都能抓取指定数量的URL。 - 优化链接筛选逻辑:先收集所有有效链接再截取指定数量,避免因无效链接导致实际抓取数量不足。
- 添加异常处理:捕获请求超时、HTTP错误等问题,防止爬虫因单个链接失败而崩溃。
- 修正过滤条件:正确检查新链接的合法性,避免错误过滤。
修改后爬虫会按照你预期的结构运行:初始URL→3个关联URL→每个关联URL再爬3个,以此类推直到达到指定深度,输出格式也符合url -> url2的要求。
内容的提问来源于stack exchange,提问作者Owergine
相关产品推荐
相关产品推荐

