本文目录导读:

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版本,它具有最好的生态支持和性能表现。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播