怎么用脚本清理无效链接

wen 实用脚本 3

本文目录导读:

怎么用脚本清理无效链接

  1. 网页HTML中的无效链接检查
  2. Linux/Unix系统脚本(Bash)
  3. 数据库链接检查(MySQL)
  4. Node.js脚本(用于爬虫/网页)
  5. 正则表达式批量清理
  6. 使用方法

我来为你介绍几种清理无效链接的脚本方案,根据不同的使用场景选择适合的方法:

网页HTML中的无效链接检查

Python脚本(使用requests + BeautifulSoup)

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
import concurrent.futures
def check_link(url):
    """检查单个链接是否有效"""
    try:
        response = requests.head(url, timeout=5, allow_redirects=True)
        if response.status_code == 404:
            return (url, False, "404 Not Found")
        elif response.status_code >= 400:
            return (url, False, f"HTTP {response.status_code}")
        return (url, True, "OK")
    except requests.exceptions.SSLError:
        return (url, False, "SSL Error")
    except requests.exceptions.ConnectionError:
        return (url, False, "Connection Error")
    except requests.exceptions.Timeout:
        return (url, False, "Timeout")
    except Exception as e:
        return (url, False, str(e))
def find_links(page_url):
    """获取页面中所有链接"""
    try:
        response = requests.get(page_url, timeout=10)
        soup = BeautifulSoup(response.text, 'html.parser')
        links = []
        for link in soup.find_all('a'):
            href = link.get('href')
            if href and not href.startswith(('#', 'mailto:', 'tel:', 'javascript:')):
                absolute_url = urljoin(page_url, href)
                links.append(absolute_url)
        return links
    except Exception as e:
        print(f"Error fetching {page_url}: {e}")
        return []
def clean_invalid_links(page_url):
    """主函数:检查并清理无效链接"""
    print(f"正在分析页面: {page_url}")
    # 获取所有链接
    all_links = find_links(page_url)
    print(f"找到 {len(all_links)} 个链接")
    # 使用线程池并发检查链接
    invalid_links = []
    with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
        future_to_link = {executor.submit(check_link, link): link for link in all_links}
        for future in concurrent.futures.as_completed(future_to_link):
            link = future_to_link[future]
            try:
                url, is_valid, message = future.result()
                if not is_valid:
                    invalid_links.append((url, message))
                    print(f"❌ 无效: {url} - {message}")
                else:
                    print(f"✅ 有效: {url}")
            except Exception as e:
                print(f"Error checking {link}: {e}")
    # 输出结果
    print(f"\n===== 检查完成 =====")
    print(f"无效链接数量: {len(invalid_links)}")
    # 保存到文件
    with open('invalid_links.txt', 'w') as f:
        for url, error in invalid_links:
            f.write(f"{url} || {error}\n")
    return invalid_links
if __name__ == "__main__":
    # 使用示例
    target_url = "http://example.com"  # 替换为你的目标URL
    clean_invalid_links(target_url)

Linux/Unix系统脚本(Bash)

清理文件系统中的无效符号链接

#!/bin/bash
# 清理无效符号链接
find_valid_links() {
    local dir="$1"
    echo "开始检查 $dir 下的符号链接..."
    # 查找所有符号链接
    find "$dir" -type l 2>/dev/null | while read -r link; do
        # 检查目标是否存在
        if [ ! -e "$link" ]; then
            echo "❌ 无效链接: $link"
            # 可选:自动删除(取消下面注释启用)
            # rm "$link"
        else
            echo "✅ 有效链接: $link"
        fi
    done
}
# 清理HP/Unix系统中的无效链接
clean_invalid_links() {
    local target_dir="${1:-.}"
    echo "开始扫描目录: $target_dir"
    # 查找并删除无效链接
    find "$target_dir" -type l -exec test ! -e {} \; -delete -print 2>/dev/null | while read -r file; do
        echo "已删除无效链接: $file"
    done
    echo "清理完成"
}
# 简化版:检查并清理
main() {
    echo "清理无效链接脚本"
    echo "================="
    # 选择模式
    case "${1:-check}" in
        check)
            find_valid_links "${2:-.}"
            ;;
        clean)
            clean_invalid_links "${2:-.}"
            ;;
        *)
            echo "用法: $0 [check|clean] [目录]"
            exit 1
            ;;
    esac
}
main "$@"

数据库链接检查(MySQL)

-- 清理数据库中的无效链接
DELIMITER $$
CREATE PROCEDURE CleanInvalidLinks()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE link_url VARCHAR(255);
    DECLARE cur CURSOR FOR SELECT url FROM your_table;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO link_url;
        IF done THEN
            LEAVE read_loop;
        END IF;
        -- 模拟检查(实际需要使用外部工具)
        -- 这里简单示例:检查URL格式
        IF link_url NOT LIKE 'http%://%' THEN
            DELETE FROM your_table WHERE url = link_url;
            SELECT CONCAT('已删除无效链接: ', link_url) AS result;
        END IF;
    END LOOP;
    CLOSE cur;
END$$
DELIMITER ;

Node.js脚本(用于爬虫/网页)

const axios = require('axios');
const cheerio = require('cheerio');
const fs = require('fs');
async function checkLink(url) {
    try {
        const response = await axios.head(url, { timeout: 5000 });
        return { url, valid: response.status < 400 };
    } catch (error) {
        return { url, valid: false, error: error.message };
    }
}
async function cleanLinks(pageUrl) {
    console.log(`开始检查页面: ${pageUrl}`);
    try {
        const response = await axios.get(pageUrl);
        const $ = cheerio.load(response.data);
        const links = [];
        // 获取所有链接
        $('a').each((index, element) => {
            const href = $(element).attr('href');
            if (href && !href.startsWith('#')) {
                links.push(new URL(href, pageUrl).href);
            }
        });
        console.log(`共找到 ${links.length} 个链接`);
        // 并发检查链接
        const results = await Promise.all(links.map(checkLink));
        const invalidLinks = results.filter(result => !result.valid);
        console.log(`无效链接: ${invalidLinks.length} 个`);
        // 保存结果
        fs.writeFileSync('invalid_links.txt', 
            invalidLinks.map(l => `${l.url} - ${l.error || 'Invalid'}`).join('\n')
        );
        return invalidLinks;
    } catch (error) {
        console.error('获取页面失败:', error.message);
        return [];
    }
}
// 使用示例
cleanLinks('http://example.com');

正则表达式批量清理

import re
中清理无效链接
def clean_html_links(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        content = file.read()
    # 匹配并检查链接
    url_pattern = r'https?://[^\s<>"\'{}|\\^`\[\]]+'
    urls = re.findall(url_pattern, content)
    invalid_count = 0
    for url in urls:
        # 简单有效性检查
        if url.count('.') < 2:  # 简单的域名检查
            content = content.replace(url, '')
            invalid_count += 1
            print(f"已移除无效链接: {url}")
    # 保存清理后的文件
    with open(file_path, 'w', encoding='utf-8') as file:
        file.write(content)
    print(f"共清理了 {invalid_count} 个无效链接")

使用方法

  1. 网页链接检查:运行Python脚本,指定要检查的页面URL
  2. 系统链接检查:运行Bash脚本,可以检查当前目录或指定目录
  3. 数据库清理:执行MySQL存储过程
  4. 爬虫项目:使用Node.js脚本集成到爬虫中

需要根据实际需求选择合适的方案,如果需要更具体的应用场景,可以告诉我你的具体需求,我帮你调整。

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