如何通过程序化方式(优先Bash)检测加载到网页的外部资源?
嘿,这个需求我太熟了!要程序化检查网站是否加载了jQuery、Imgur这类资源,分两种场景来处理就行——静态引用的资源和JS动态加载的资源,优先用Bash的话,给你整理几个实用的方案:
这种情况用curl+grep就能搞定,因为资源链接直接写在初始HTML里,不需要执行JS。
1. 检查jQuery
用正则匹配常见的jQuery文件名(比如jquery.min.js):
# 直接查看匹配结果 curl -s https://你的目标网站.com | grep -E 'jquery\.min\.js|jquery\.js' # 脚本里判断是否存在(静默模式,只返回状态) if curl -s https://你的目标网站.com | grep -q 'jquery\.min\.js'; then echo "✅ 检测到静态引用的jQuery" else echo "❌ 未检测到静态引用的jQuery" fi
-s是静默模式(不显示下载进度),-q让grep只返回退出码(0表示匹配到,1表示没匹配到),适合脚本逻辑判断。
2. 检查Imgur图片
匹配Imgur图片的典型URL格式(i.imgur.com开头的图片链接):
curl -s https://你的目标网站.com | grep -E 'https?://i\.imgur\.com/[a-zA-Z0-9]+\.(png|jpg|jpeg|gif)'
如果资源是浏览器执行JS后才加载的(比如懒加载的图片、异步加载的脚本),curl就抓不到了——这时候需要用无头浏览器模拟真实浏览器的加载过程,Chrome/Chromium或Firefox都支持无头模式。
方法1:Chrome/Chromium无头模式 + HAR文件解析
Chrome可以生成HAR(HTTP Archive)文件,里面包含所有加载的资源请求,再用jq(JSON解析工具,需要提前安装)提取URL进行匹配。
步骤:
- 生成HAR文件(包含所有资源请求):
chromium --headless --disable-gpu --har=output.har --no-sandbox https://你的目标网站.com
--har=output.har指定把请求日志保存为HAR文件,--no-sandbox是Linux下的必要参数(避免权限问题)。
- 解析HAR文件,检查目标资源:
# 检查是否加载了jQuery(只看成功返回的请求,状态码200) jq '.log.entries[] | select(.response.status == 200) | .request.url' output.har | grep -E 'jquery\.min\.js' # 检查是否加载了Imgur图片 jq '.log.entries[] | select(.response.status == 200) | .request.url' output.har | grep -E 'i\.imgur\.com'
- 一键式脚本判断:
# 直接输出结果,不用保存HAR文件 chromium --headless --disable-gpu --har=- --no-sandbox https://你的目标网站.com 2>/dev/null | \ jq '.log.entries[] | .request.url' | \ grep -q 'jquery\.min\.js' && echo "✅ 检测到jQuery(静态/动态加载)" || echo "❌ 未检测到jQuery"
--har=-把HAR内容输出到标准输出,2>/dev/null忽略无头浏览器的无关报错。
方法2:Firefox无头模式(类似Chrome)
如果你习惯用Firefox,命令格式差不多:
# 生成HAR文件 firefox --headless --screenshot /dev/null --har output.har https://你的目标网站.com # 解析检查资源 jq '.log.entries[] | .request.url' output.har | grep -E 'i\.imgur\.com'
备选:wget蜘蛛模式(局限性大)
如果不想装无头浏览器,可以用wget的蜘蛛模式模拟爬取,但它不执行JS,只能抓到静态资源和HTML里声明的链接,动态加载的还是抓不到:
wget --spider --recursive --level=1 --no-parent https://你的目标网站.com 2>&1 | grep -E 'jquery|imgur'
--spider是只检查链接不下载,--level=1限制只爬一级页面的资源。
把检查逻辑封装成函数,方便日常调用:
check_loaded_resource() { local target_url=$1 local resource_pattern=$2 # 用Chrome无头模式获取所有请求URL,过滤匹配项 chromium --headless --disable-gpu --har=- --no-sandbox "$target_url" 2>/dev/null | \ jq -r '.log.entries[] | .request.url' | \ grep -E "$resource_pattern" | uniq # 判断是否匹配到 if [ $? -eq 0 ]; then echo -e "\n✅ 检测到匹配资源:$resource_pattern" else echo -e "\n❌ 未检测到匹配资源:$resource_pattern" fi } # 使用示例 check_loaded_resource "https://你的目标网站.com" "jquery\.min\.js" check_loaded_resource "https://你的目标网站.com" "i\.imgur\.com/[a-zA-Z0-9]+\.(png|jpg)"
uniq用来去重重复的资源URL,-r让jq输出纯文本URL(不带引号)。
内容的提问来源于stack exchange,提问作者VPL

