ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

URL后缀批量筛选去重工具:用批处理替代Excel处理10万条数据

URL后缀批量筛选去重工具:用批处理替代Excel处理10万条数据 简介这是面向需批量管理海量网址的专业用户的轻量工具包由AI虎哥定制解决大量URL按指定后缀筛选、排除过滤、去重保存的效率问题。包内共11个文件含主程序exe、批处理bat、说明txt及html/url快捷入口等整体仅66KB小巧即用。工具采用智能多线程处理可应对数十万乃至百万级网址实现秒级响应适合市场分析、数据采集、爬虫开发等场景。已有56人学习下载。除核心筛选与去重能力外还提供常用后缀参考、自定义后缀列表及“必看文件”使用指引方便快速上手并适配个性化规则。1. URL网址指定后缀批量筛选处理工具为什么 10 万条网址用 Excel 会翻车做网站运维或数据采集的人电脑里多半存着一堆「看起来有用但不知道哪天会用」的 URL 清单。等到真要清洗这批数据——比如只保留 .html、.aspx 结尾的地址去掉重复项顺便看看每个后缀各有多少条——用 Excel 打开 10 万行筛选卡顿、去重要靠辅助列公式最后导出时还容易把 URL 里的特殊字符搞坏。这时候你会明白一个绿色免安装的「URL网址指定后缀批量筛选处理工具大量网址批量处理去重.zip」其实解决的是最朴素的痛点以指定的后缀为筛子在纯文本层面完成过滤、去重、统计三件事。它的核心是一套 Windows 批处理脚本不依赖 Python 环境解压即用适合需要快速处理超大 URL 列表、又不想为一次清洗去装运行时的场景。2. 后缀筛选与去重的批处理实现findstr、sort 与临时文件的三条通路2.1 为什么用批处理而不是写个 Python 中间件常见的处理思路是写 Python 脚本用 set() 去重、用 str.endswith() 过滤后缀但问题在于目标机器不一定装了 Python。而这个 zip 工具面向的是 Windows 环境下的编辑、运维、运营人员他们能双击运行的只有 .bat。批处理方案的优点是零依赖、逻辑透明、任何人打开 .bat 都能改参数缺点是长文本处理慢、正则能力弱。可大量 URL 去重恰恰是批处理的舒适区sort自带去重参数findstr做后缀匹配配合临时文件传递中间结果完全能覆盖需求。整个工具的运行思路是三段式流水线先按后缀筛选生成「仅含目标后缀」的临时文件再做排序与去重最后按后缀维度统计数量。三条通路之间用独立的临时文件衔接不搞内存变量传递因为批处理在 for 循环里传大量变量极易触发延迟展开的玄学问题。2.2 findstr 在 URL 后缀筛选里的边界findstr是批处理里唯一能当正则用的命令但它的正则与传统正则很不一样\d不识别必须写[0-9].不是任意字符而是字面点号$在findstr里不是行尾锚点行尾锚点是/e。后缀筛选最常用的是findstr /e \.html$这种直觉写法但实际要写成findstr /i /e .html input.txt output_html.txt这里/i表示忽略大小写/e表示匹配行尾.html前面的点是字面点号。注意findstr不支持$锚点所以在行尾规则里直接写后缀文本即可。如果要匹配「以 .html 或 .htm 结尾」的两种后缀可以用空格分隔多个搜索词findstr /i /e .html .htm input.txt output_pages.txt多个搜索词之间是「或」关系。这里最容易踩坑的是 URL 里包含查询参数的情况https://example.com/index.php?id123的结尾是123不是.php所以用/e匹配会漏掉。常见的处理方式是先把查询参数剥掉或者干脆把筛选条件放宽为「匹配.php或.php?」findstr /i /e .php .php? input.txt output_php.txt2.3 sort 与 unique批处理去重的两种做法批处理去重有两条路线效果不同坑也不同。第一条是sort /unique一步到位sort /unique input.txt deduped.txt/unique会忽略重复行且排序输出但它在处理 10 万行级别时表现稳定前提是输入文件必须每行一个 URL且行尾是 CRLF。如果文件是从 Linux 或 macOS 拷来的行尾是 LFsort会把整个文件当成一行来处理去重直接失效。所以第一步永远是先统一行尾type input.txt | findstr /v $ input_crlf.txt这条命令其实是把「以 $ 结尾的行」反向过滤掉比较绕而且对 LF 文件无效。真正可靠的做法是用more命令转换more input.txt input_crlf.txtmore会在输出时把 LF 统一成 CRLF。这是很多批处理老手默认不做、但新手一定会遇到的隐藏坑。第二条路线是先排序再去重复行适合需要保留「首次出现」顺序的场景sort input.txt | findstr /v /b /e /x !last! deduped.txt这段逻辑需要延迟展开配合比较复杂。实际上批处理做「保留首次出现顺序」的去重非常别扭要用findstr /n ^给每行加行号再排序得不偿失。我的建议是除非明确要求保留原始顺序否则直接用sort /unique把顺序问题交给后续的 Excel 或 Python 再处理。2.4 统计每个后缀的数量for /f 与 find /c 的组合筛选去重之后还要回答「每个后缀各有多少条」这个问题。常见做法是先用findstr把每个后缀的结果分别导出再用find /c /v 数行数find /c /v output_html.txtfind /c /v 是批处理里数行数的标准写法/v 匹配所有非空行/c只输出计数。但这样每次只能数一个文件如果后缀有十几个就要写十几条命令。更优雅的做法是用 for 循环遍历后缀列表echo off setlocal enabledelayedexpansion set SUFFIX_LIST.html .htm .php .aspx .jsp for %%s in (%SUFFIX_LIST%) do ( findstr /i /e %%s input.txt temp_%%s.txt for /f %%c in (find /c /v ^ temp_%%s.txt) do ( echo %%s : %%c ) )注意这里的find /c /v 是从文件重定向读入符号在 for /f 的命令行里必须转义为^。这段脚本有个隐藏问题for /f在执行find /c时如果文件为空%%c拿到的值可能为空字符串导致输出行格式错乱。所以稳妥的写法是先判断文件大小再决定是否统计for %%s in (%SUFFIX_LIST%) do ( findstr /i /e %%s input.txt temp_%%s.txt for %%a in (temp_%%s.txt) do ( if not %%~za0 ( for /f %%c in (find /c /v ^ temp_%%s.txt) do echo %%s : %%c ) else ( echo %%s : 0 ) ) )%%~za是 for 变量修饰符表示文件大小这是判断空文件最直接的办法。3. 把工具落地成 zip 包文件清单与完整脚本拆解3.1 zip 包内的目录结构与文件分工一个可用的「URL网址指定后缀批量筛选处理工具」zip 包打开之后应该是这样的布局文件/目录作用类型run_all.bat一键执行完整流程批处理脚本config.bat后缀列表与输入输出文件名配置批处理脚本被 callfilter_suffix.bat按后缀筛选批处理脚本sort_unique.bat排序去重批处理脚本url_stat.bat后缀统计批处理脚本input/输入目录把待处理文件放这里目录output/输出目录存放筛选、去重、统计结果目录用call链式调用而不是把全部逻辑写进一个 .bat是为了让每个环节可以被单独调试。如果筛选环节出了问题直接在命令行跑filter_suffix.bat就能看到是哪条 findstr 报错不需要把整个流程重跑一遍。3.2 config.bat后缀列表的集中管理echo off rem 本文件由 run_all.bat 调用集中管理所有可调参数 set INPUT_FILEinput\urls.txt set OUTPUT_DIRoutput set DEDUP_FILE%OUTPUT_DIR%\all_deduped.txt set STAT_FILE%OUTPUT_DIR%\suffix_stat.txt rem 目标后缀列表用空格分隔。注意后缀不需要带前面的点脚本会自动补 set SUFFIX_LISThtml htm php aspx jsp shtml rem 是否启用黑名单模式0白名单(只保留列表中的后缀) 1黑名单(剔除列表中的后缀) set BLACKLIST_MODE0参数集中在 config.bat 里能避免每次改后缀都要打开三个脚本。这里有个约定后缀列表写html而不是.html因为脚本内部会统一处理点号防止有人配成.html有人配成html导致匹配结果不一致。3.3 run_all.bat主入口与流程编排echo off setlocal enabledelayedexpansion call config.bat rem 环境检查 if not exist %INPUT_FILE% ( echo [错误] 输入文件不存在: %INPUT_FILE% exit /b 1 ) if not exist %OUTPUT_DIR% mkdir %OUTPUT_DIR% rem 第一步按后缀筛选 call filter_suffix.bat rem 第二步合并并去重 call sort_unique.bat rem 第三步统计 call url_stat.bat echo [完成] 全部处理结束结果文件在 %OUTPUT_DIR% 目录下 echo [提示] 筛选明细见 _suffix 前缀文件去重总表见 all_deduped.txt endlocalsetlocal enabledelayedexpansion放在最前面是为了让子脚本继承延迟展开环境。call config.bat会把 config 里的变量加载到当前环境子脚本不需要重复读取配置。环境检查的两个 if 是必要的因为输入文件路径写错时后续的 findstr 会静默失败生成一堆空文件排查起来更费劲。3.4 filter_suffix.bat循环筛选并落盘echo off setlocal enabledelayedexpansion call config.bat rem 白名单模式只保留匹配后缀的行 if %BLACKLIST_MODE%0 ( for %%s in (%SUFFIX_LIST%) do ( findstr /i /e .%%s %INPUT_FILE% %OUTPUT_DIR%\_suffix_%%s.txt echo [筛选] 后缀 %%s 已导出 ) ) rem 黑名单模式剔除匹配后缀的行 if %BLACKLIST_MODE%1 ( set EXCLUDE_CMDfindstr /i /v for %%s in (%SUFFIX_LIST%) do ( set EXCLUDE_CMD!EXCLUDE_CMD! /e .%%s ) %EXCLUDE_CMD% %INPUT_FILE% %OUTPUT_DIR%\_excluded.txt )黑名单模式的!EXCLUDE_CMD!动态拼接是批处理里比较高级的用法把多个/e参数拼成一条完整命令再执行。注意这种拼接方式对后缀数量有限制如果超过 20 个后缀命令行长度可能超限此时建议拆成多次 findstr 并对中间结果取差集。实际使用中白名单模式是绝对主流黑名单场景很少遇到但保留这个开关能提高工具的通用性。3.5 sort_unique.bat合并、排序、去重echo off setlocal enabledelayedexpansion call config.bat rem 合并所有 _suffix 前缀文件为一个总表 set MERGED_FILE%OUTPUT_DIR%\_merged_raw.txt if exist %MERGED_FILE% del %MERGED_FILE% for %%f in (%OUTPUT_DIR%\_suffix_*.txt) do ( type %%f %MERGED_FILE% ) rem 先统一行尾再排序去重 more %MERGED_FILE% %OUTPUT_DIR%\_merged_crlf.txt sort /unique %OUTPUT_DIR%\_merged_crlf.txt %DEDUP_FILE% rem 校验去重前后行数对比 for /f %%c in (find /c /v ^ %MERGED_FILE%) do set BEFORE%%c for /f %%c in (find /c /v ^ %DEDUP_FILE%) do set AFTER%%c echo [去重] 原始 %BEFORE% 行去重后 %AFTER% 行剔除 %BEFORE% - %AFTER% 行 endlocalmore统一行尾这一步对来自不同来源的 URL 清单是保命操作。sort /unique的输出直接写入最终文件同时用find /c /v 统计前后行数并打印对比。这里的删除临时文件的时机放在合并前避免上次运行的残留数据污染本次结果。3.6 url_stat.bat后缀维度统计echo off setlocal enabledelayedexpansion call config.bat rem 清除旧统计文件 if exist %STAT_FILE% del %STAT_FILE% rem 统计每个筛选结果文件的行数 for %%f in (%OUTPUT_DIR%\_suffix_*.txt) do ( set FNAME%%~nf set SUFFIX!FNAME:_suffix_! for %%c in (find /c /v ^ %%f) do set COUNT%%c echo !SUFFIX! !COUNT! %STAT_FILE% ) rem 统计去重总行数并追加到文件末尾 for /f %%c in (find /c /v ^ %DEDUP_FILE%) do set TOTAL%%c echo TOTAL %TOTAL% %STAT_FILE% echo [统计] 已生成 %STAT_FILE% endlocalset SUFFIX!FNAME:_suffix_!是批处理里的字符串替换把文件名中的_suffix_前缀替换成空从而得到原始后缀名。这里用!而不是%是因为处于延迟展开环境且变量是在 for 循环内部赋值的。统计文件是纯文本格式每行一个后缀加空格加数量方便后续直接用 Excel 分列。4. 参数调优与边界场景编码、URL 编码、超大文件的三个必须处理的问题4.1 编码陷阱ANSI 与 UTF-8 的分裂批处理脚本读写文本时编解码方式取决于当前代码页也就是chcp的输出。Windows 中文系统默认是 936GBK如果输入文件是 UTF-8 编码findstr 逐行读取时会按 GBK 解码中文字符会被拆成错乱字节导致匹配结果异常。最简单的规避办法是要求输入文件必须为 ANSIGBK或无 BOM 的 UTF-8并且在脚本开头显式声明期望的编码环境。chcp 65001 nulchcp 65001切到 UTF-8 代码页后findstr 对 UTF-8 文件逐行扫描能够正确解码中文和特殊字符但此时 bat 脚本文件本身的编码也必须是 UTF-8 无 BOM否则脚本里的中文注释和 echo 会乱码。如果脚本是 ANSI 保存的切到 65001 后中文反而乱码。这是一个无解的循环所以我的建议是脚本文件保持 ANSI 保存输入文件统一换成 ANSI 编码再喂给工具。用记事本打开输入文件另存为 ANSI 即可。4.2 URL 编码字符%20 与 %E4%B8%AD 会影响后缀匹配吗URL 里常见的编码字符如%20、%E7%AD%89不会出现在行尾所以对后缀筛选没有影响。但如果 URL 原本是中文路径浏览器复制出来是编码形态解码后结尾恰好是中文而不是后缀筛选就会漏掉。处理方式有两种一是把「解码后的后缀」也加入后缀列表比如%E4%B8%AD这种编码没有固定后缀规律不现实二是对 URL 做一次「先解码再筛选」的预处理这超出了批处理的能力范围只能用 PowerShell 补充。PowerShell 里可以用[System.Uri]::UnescapeDataString()做 URL 解码然后输出到新文件再喂给批处理工具Get-Content input\urls.txt | ForEach-Object { [System.Uri]::UnescapeDataString($_) } | Set-Content input\urls_decoded.txt -Encoding UTF8这是 zip 包外部的一个可选前置步骤不放进 bat 主流程因为 PowerShell 执行策略和编码在不同机器上差异较大放进来会增加工具的脆弱性。4.3 10 万级以上 URL 的处理策略分片与资源限制批处理处理文本时findstr 和 sort 都是逐行扫描内存占用不算高但sort在排序 10 万行以上时会产生多个临时文件磁盘空间不足会直接报错。遇到特别大的文件我一般先做一次「按行号分片」每 5 万行切成一个子文件分别去重后再合并、再去重一次。分片脚本echo off setlocal enabledelayedexpansion set SRClarge_input.txt set /a LINE_NUM0 set /a FILE_IDX0 for /f usebackq delims %%l in (%SRC%) do ( set /a LINE_NUM1 set /a MOD!LINE_NUM! %% 50000 if !MOD!1 ( set /a FILE_IDX1 ) echo %%l part_!FILE_IDX!.txt ) endlocalset /a MOD!LINE_NUM! %% 50000求余数来判定当前行属于哪个分片。分片后用同一个 sort_unique.bat 对每个分片去重再把所有分片合并做第二次去重。两轮去重的结果与一轮去重完全一致只是把排序的内存压力分散到磁盘上。5. 避坑指南批处理处理 URL 时最常翻车的 5 个问题5.1 第 1 坑findstr 匹配子串导致后缀误筛现象设置了html后缀结果https://example.com/index.html?fromwechat也被保留但https://example.com/page.htm没被保留。原因findstr /e .html匹配的是「行尾包含 .html」而?fromwechat结尾的行尾是wechat理论上不该被匹配。如果实际被匹配了说明后缀列表里可能写的是html而不是.htmlfindstr /e html会匹配行尾任意包含html的行包括index.htmlandmore这种情况。解决后缀列表统一由脚本补全点号且用/e严格要求行尾匹配。筛选后抽查结果文件的前 50 行确认没有带查询参数的 URL 混入。5.2 第 2 坑sort /unique 结果数量与预期不符现象去重后数量比预想少很多或者比预想多。原因sort /unique的去重是基于「整行完全相同」URL 大小写、结尾斜杠、协议头差异都会被视为不同行。https://Example.com/a与https://example.com/a在 sort 看来是两条数据不会被去重。如果输入文件是 LF 行尾sort 会把整个文件当一行产生匪夷所思的结果。解决先统一行尾more命令再对 URL 做规范化预处理统一小写、去掉尾部斜杠、统一 https/http。批处理做小写转换很麻烦可以在 PowerShell 里预处理Get-Content input.txt | ForEach-Object { $_.Trim().TrimEnd(/).ToLower() } | Sort-Object -Unique | Set-Content output.txt5.3 第 3 坑空文件导致 find /c 返回「找不到文件」现象某个后缀在输入文件中不存在统计环节报「系统找不到指定的文件」。原因findstr没有匹配到任何行时不会创建输出文件后续find /c /v 该文件就会因为文件不存在而报错并中断整个 for 循环。解决在统计前先判断文件是否存在if exist %%f ( for /f %%c in (find /c /v ^ %%f) do set COUNT%%c ) else ( set COUNT0 )5.4 第 4 坑批处理里 for /f 处理 10 万行会卡很久现象run_all.bat 跑起来后命令行窗口长时间无输出看起来像死机。原因for /f逐行读取文件时如果每行还要做字符串替换或 findstr 管道速度会急剧下降。10 万行可能要跑 10 分钟以上这是批处理的性能瓶颈不是死循环。解决把「逐行操作」改成「整文件操作」。findstr、sort、find 都是原生逐行处理速度远快于 for /f 循环。如果确实需要逐行逻辑比如过滤含特定参数的 URL用 findstr 做批量正则匹配代替 for /f 逐行判断速度能提升一个数量级。5.5 第 5 坑zip 解压后脚本路径包含中文导致乱码现象解压到D:\数据处理工具\目录后脚本输出的结果文件名乱码。原因bat 脚本默认按 ANSIGBK解析如果脚本文件本身是 UTF-8 编码且当前代码页是 65001中文路径和注释会乱码。带中文的路径在 for /f 里还可能被截断。解决zip 包内的脚本统一用 ANSI 编码保存路径尽量使用纯英文目录。这是血泪经验我踩过两次之后所有 bat 文件都默认 ANSI 编码除非明确知道目标机器只有 UTF-8 环境。6. 进阶验证方法用构造数据集检验去重与筛选的正确性这个工具做完之后不能直接拿真实数据跑一遍就认为可用必须先构造一个「带毒」的验证集。我会准备三组数据一组是正常 URL一组是带查询参数的 URL一组是大小写混写和行尾不一致的 URL故意做成踩坑数据。验证脚本如下echo off setlocal enabledelayedexpansion set TEST_FILEtest_input.txt set EXPECTED_HTML3 set EXPECTED_PHP2 set EXPECTED_TOTAL5 echo https://example.com/a.HTML %TEST_FILE% echo https://example.com/b.html?from1 %TEST_FILE% echo https://example.com/c.htm %TEST_FILE% echo https://example.com/d.php %TEST_FILE% echo https://example.com/e.php?x2 %TEST_FILE% echo https://example.com/f.aspx %TEST_FILE% call filter_suffix.bat call sort_unique.bat for /f tokens1,2 %%a in (%STAT_FILE%) do ( echo %%a : %%b )验证要点有三个。第一统计结果必须等于手动数出来的数量比如 .html 应该是 2a.HTML 和 b.html 算两条还是算一条取决于是否忽略大小写这里预期应先统一小写再匹配。第二去重后 TOTAL 应该是 5 而不是 6因为有两条 URL 是重复的。第三验证.htm与.html被区分成两个独立后缀而不是混淆成一个。我最常用的验证习惯是把工具的筛选输出与 Python 一行代码的结果做交叉比对urls [line.strip() for line in open(input.txt, encodingutf-8)] filtered [u for u in urls if u.endswith((.html, .htm, .php))] deduped list(dict.fromkeys(filtered)) print(len(deduped), len(filtered))批处理结果与 Python 结果一致才算真正通过。如果不一致优先检查行尾编码和大小写归一化两个环节。这套验证流程我每次处理完一批新数据都会跑一遍等于是给批处理脚本加了一道后悔药。希望帮到你。本文还有配套的精品资源点击获取
返回列表