本文目录导读:

Python脚本(推荐)
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
import pandas as pd
from tqdm import tqdm
def check_url(url, timeout=5):
"""检查单个图片链接是否有效"""
try:
response = requests.head(url, timeout=timeout, allow_redirects=True)
content_type = response.headers.get('content-type', '')
# 判断是否为有效图片(状态码200且Content-Type包含image)
if response.status_code == 200 and 'image' in content_type:
return url, True, response.status_code
else:
return url, False, response.status_code
except Exception as e:
return url, False, str(e)
def batch_check_urls(url_list, max_workers=20, output_file='checked_results.csv'):
"""批量校验图片链接"""
results = []
with ThreadPoolExecutor(max_workers=max_workers) as executor:
# 创建进度条
futures = {executor.submit(check_url, url): url for url in url_list}
with tqdm(total=len(url_list)) as pbar:
for future in as_completed(futures):
url, is_valid, status = future.result()
results.append({'url': url, 'valid': is_valid, 'status': status})
pbar.update(1)
# 保存结果到CSV
df = pd.DataFrame(results)
df.to_csv(output_file, index=False)
# 统计信息
valid_count = sum(1 for r in results if r['valid'])
invalid_count = len(results) - valid_count
print(f"✅ 校验完成!有效链接: {valid_count}, 无效链接: {invalid_count}")
print(f"📁 结果已保存到: {output_file}")
return results
# 使用示例
if __name__ == "__main__":
# 你的图片链接列表
image_urls = [
"https://example.com/image1.jpg",
"https://example.com/image2.png",
# ... 更多链接
]
# 从文件读取链接
# with open('urls.txt', 'r') as f:
# image_urls = [line.strip() for line in f if line.strip()]
results = batch_check_urls(image_urls)
Shell脚本(Linux/Mac)
#!/bin/bash
# check_images.sh
INPUT_FILE="image_urls.txt"
OUTPUT_FILE="valid_images.txt"
INVALID_FILE="invalid_images.txt"
# 清空输出文件
> "$OUTPUT_FILE"
> "$INVALID_FILE"
# 计数器
total=0
valid=0
echo "开始批量校验图片链接..."
while IFS= read -r url; do
((total++))
# 使用curl发送HEAD请求检查
http_code=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 --max-time 10 "$url")
content_type=$(curl -s -I --connect-timeout 5 --max-time 10 "$url" | grep -i "Content-Type")
if [[ $http_code == "200" ]] && [[ $content_type == *"image"* ]]; then
echo "$url" >> "$OUTPUT_FILE"
((valid++))
echo -e "\033[32m[有效]\033[0m $url"
else
echo "$url" >> "$INVALID_FILE"
echo -e "\033[31m[无效]\033[0m $url (HTTP: $http_code)"
fi
done < "$INPUT_FILE"
echo "校验完成!"
echo "总链接数: $total"
echo "有效链接: $valid"
echo "无效链接: $((total - valid))"
echo "有效链接已保存到: $OUTPUT_FILE"
echo "无效链接已保存到: $INVALID_FILE"
Node.js脚本
// check_images.js
const fetch = require('node-fetch');
const fs = require('fs');
const { performance } = require('perf_hooks');
async function checkImage(url, timeout = 5000) {
try {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), timeout);
const response = await fetch(url, {
method: 'HEAD',
signal: controller.signal,
redirect: 'follow'
});
clearTimeout(timeoutId);
const contentType = response.headers.get('content-type') || '';
return {
url,
valid: response.ok && contentType.includes('image'),
status: response.status
};
} catch (error) {
return {
url,
valid: false,
status: error.name === 'AbortError' ? 'timeout' : error.message
};
}
}
async function batchCheck(urls, concurrency = 20) {
const results = [];
let index = 0;
async function worker() {
while (index < urls.length) {
const url = urls[index++];
const result = await checkImage(url);
results.push(result);
// 进度显示
const progress = Math.round((results.length / urls.length) * 100);
process.stdout.write(`\r进度: ${progress}% (${results.length}/${urls.length})`);
}
}
const workers = Array(concurrency).fill().map(() => worker());
await Promise.all(workers);
console.log('\n校验完成!');
// 统计
const valid = results.filter(r => r.valid);
const invalid = results.filter(r => !r.valid);
console.log(`有效链接: ${valid.length}`);
console.log(`无效链接: ${invalid.length}`);
// 保存结果
fs.writeFileSync('valid_images.json', JSON.stringify(valid, null, 2));
fs.writeFileSync('invalid_images.json', JSON.stringify(invalid, null, 2));
return results;
}
// 使用示例
const imageUrls = [
'https://example.com/image1.jpg',
'https://example.com/image2.png'
];
batchCheck(imageUrls, 30).catch(console.error);
使用在线工具(无需编程)
-
Broken Link Checker
- 访问:https://www.brokenlinkcheck.com/
- 粘贴链接列表,检查图片链接
-
Dead Link Checker
- 访问:https://www.deadlinkchecker.com/
- 支持批量URL检查
-
W3C Link Checker
- 访问:https://validator.w3.org/checklink
- 适合验证少量链接
最佳实践建议
-
性能优化
- 使用并发请求(建议20-50并发)
- 设置合理的超时时间(5-10秒)
- 使用HEAD请求代替GET请求
-
避免被封
- 添加User-Agent头部
- 控制请求速率(增加延迟)
- 使用代理IP轮换
-
输出格式
- 保存原始列表和校验结果
- 生成统计报告
- 导出有效/无效链接分离文件
-
错误处理
- 记录详细错误信息
- 支持断点续传
- 处理网络异常和重定向
选择适合你技术栈的实现方案,推荐使用Python版本,它具有最好的生态支持和性能表现。