打开CMD,敲下`curl -O http://example.com/file.zip`,回车。进度条开始爬。这就是最原始的“爬虫”——用系统自带工具把网络上的东西拽下来。别笑,很多人写了几百行Python,最后发现批量下载图片还不如一行`for /l %i in (1,1,100) do curl -O http://site.com/img%i.jpg`来得快。
CMD爬虫不是让你用批处理去解析DOM。那太蠢了。它的核心价值在于调度和触发。我见过一个运维老哥,用`schtasks`定时跑一个.bat,里面就三行:`curl`拉取目标页面,`findstr`过滤出关键链接,`wget`递归下载。整套东西跑在Windows Server 2003上,稳了七年。问他为什么不用Scrapy,他说:“那玩意儿依赖Python,我这台机器连.NET都没装。”
具体怎么干?先解决“抓”的问题。Windows 10之后自带`curl`,老系统可以用`bitsadmin`。比如`bitsadmin /transfer myJob /download /priority normal http://example.com/data.csv D:\data.csv`。这命令支持断点续传,比`curl`在某些内网环境更皮实。抓下来的东西通常是HTML,别想着用CMD解析标签,那是自虐。用`findstr`做粗筛就够了。比如抓所有` links.txt`。然后`for /f`循环提取引号里的URL。代码大概长这样:
for /f "tokens=2 delims=\"" %a in (links.txt) do echo %a >> urls.txt 注意,这是命令行直接执行。写进.bat文件要改成`%%a`。这一步会带出大量垃圾链接,比如`javascript:void(0)`。用`findstr /v`排除掉:`findstr /v "javascript" urls.txt > clean.txt`。
接下来是“爬”的深度问题。CMD没有天然的队列管理。但可以用文件夹模拟。建一个`queue`目录,把待抓URL写成一个个空文件,文件名就是URL的MD5。每抓完一个就删掉文件。写个循环:`for %%f in (queue\*) do (curl -O %%f && del %%f)`。这法子土,但能跑。并发?用`start /b`开多个窗口。我试过同时开20个`curl`进程,CPU占用不到5%,瓶颈全在网卡。
有个坑得说。CMD对特殊字符的处理极其反人类。URL里的`&`会被解释成命令分隔符。必须用`^`转义,或者把URL塞进变量再用`!var!`延迟扩展。更稳的办法是写个VBScript中转,但那就偏离“CMD爬虫”的本意了。我的做法是先用`certutil -urlcache -split -f`下载,这命令对URL的容忍度比`curl`高。虽然微软说它弃用了,但Win11上还能跑。
实际案例:去年帮人抓一个政府公开数据网站。每页是个PDF,URL规律是`/doc/2023/001.pdf`到`/doc/2023/999.pdf`。Python脚本要装requests、BeautifulSoup,还得处理SSL证书错误。我直接写了个bat:
@echo off for /l %%i in (1,1,999) do ( set num=00%%i set num=!num:~-3! curl -k -o doc_!num!.pdf https://site.com/doc/2023/!num!.pdf ) 注意`set num=00%%i`然后取后三位,这是为了处理001这种前导零。`-k`跳过证书验证。跑了一晚上,999个PDF全下完。中间断网了?加个`if not exist doc_!num!.pdf`判断就行。比Python省事多了。
当然,CMD爬虫的边界很清楚。它做不了登录、处理不了JS渲染、没法解析JSON。但如果你只需要批量下载、定时抓取、或者在内网隔离环境里搞点数据,别瞧不起这个黑框框。它就在那里,不需要pip install,不需要虚拟环境。敲个`help`,所有武器都列出来了。有时候最笨的工具,反而最不容易坏。