使用argparse读取文件拼接URL请求时持续返回404问题排查
问题分析与修复方案
核心问题排查
- 单词含换行符:从文件逐行读取的单词会保留末尾的
\n,拼接后URL变成{target}/word\n,属于无效路径,直接导致404。必须用strip()去除换行符和首尾空白。 - 错误递归逻辑:遇到404时递归调用
loop()会触发无限递归,既破坏遍历逻辑,还会引发栈溢出。正确逻辑是继续遍历下一个单词,而非重新启动循环。 - 参数校验缺失:
-u参数未设置必填,若用户未输入目标URL,target为空,拼接后的URL必然无效。需强制要求该参数。 - JSON解析风险:若响应内容非JSON格式,调用
res.json()会抛出异常,需添加异常处理。
修复后的代码
import requests import argparse parser = argparse.ArgumentParser(description='遍历单词列表拼接URL发送请求') parser.add_argument("-u", required=True, help="目标基础URL,例如https://example.com") parser.add_argument("-f", required=True, type=argparse.FileType('r'), help="单词列表文件路径") args = parser.parse_args() target = args.u wordlist = args.f def scan_paths(): # 读取所有行并处理换行符,过滤空行后关闭文件 words = [word.strip() for word in wordlist if word.strip()] wordlist.close() for word in words: # 处理URL末尾已有/的情况,避免出现// url = f"{target.rstrip('/')}/{word}" print(f"请求路径: {url}") try: res = requests.get(url) print(f"路径: {word} | 状态码: {res.status_code}") if res.status_code != 404: try: data = res.json() print(f"响应JSON: {data}") except ValueError: print("提示:响应内容非JSON格式") except requests.exceptions.RequestException as e: print(f"请求失败: {str(e)}") scan_paths()
修复说明
- 用
argparse.FileType('r')替代直接type=open,符合argparse最佳实践,自动管理文件打开模式。 - 过滤空行,避免请求无效的空路径。
- 用
target.rstrip('/')处理目标URL末尾的斜杠,防止拼接后出现//的无效格式。 - 添加网络请求异常捕获,处理连接超时、DNS解析失败等问题。
- 移除错误递归,改为正常循环遍历单词列表。
- 给参数添加必填约束和帮助信息,提升工具易用性。
内容的提问来源于stack exchange,提问作者Berkan Özelmacı
相关产品推荐
相关产品推荐

