如何编写批量校验图片链接有效性

wen 实用脚本 30

本文目录导读:

如何编写批量校验图片链接有效性

  1. 方法一:Python脚本(推荐)
  2. 方法二:Shell脚本(Linux/Mac)
  3. 方法三:Node.js脚本
  4. 方法四:使用在线工具(无需编程)
  5. 最佳实践建议

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);

使用在线工具(无需编程)

  1. Broken Link Checker

    • 访问:https://www.brokenlinkcheck.com/
    • 粘贴链接列表,检查图片链接
  2. Dead Link Checker

    • 访问:https://www.deadlinkchecker.com/
    • 支持批量URL检查
  3. W3C Link Checker

    • 访问:https://validator.w3.org/checklink
    • 适合验证少量链接

最佳实践建议

  1. 性能优化

    • 使用并发请求(建议20-50并发)
    • 设置合理的超时时间(5-10秒)
    • 使用HEAD请求代替GET请求
  2. 避免被封

    • 添加User-Agent头部
    • 控制请求速率(增加延迟)
    • 使用代理IP轮换
  3. 输出格式

    • 保存原始列表和校验结果
    • 生成统计报告
    • 导出有效/无效链接分离文件
  4. 错误处理

    • 记录详细错误信息
    • 支持断点续传
    • 处理网络异常和重定向

选择适合你技术栈的实现方案,推荐使用Python版本,它具有最好的生态支持和性能表现。

抱歉,评论功能暂时关闭!