404页面检测

简介: 要检测一个网页是否是404页面,你可以尝试以下方法:HTTP状态码检查:发送HTTP请求并检查返回的状态码。如果网页是404页面,服务器将返回404状态码。你可以使用编程语言或工具(如Python的requests库)发送HTTP请求,并检查返回的状态码是否为404。

本文源地址

页面分析合集地址

页面内容分析之404页面检测

先来看看机器人怎么说:

要检测一个网页是否是404页面,你可以尝试以下方法:
HTTP状态码检查:发送HTTP请求并检查返回的状态码。如果网页是404页面,服务器将返回404状态码。你可以使用编程语言或工具(如Python的requests库)发送HTTP请求,并检查返回的状态码是否为404。
页面内容检查:发送HTTP请求并获取网页内容。然后,检查页面内容是否包含404相关的文本或关键词。通常,404页面会包含类似于"404"、"页面未找到"、"Not Found"等关键词。你可以使用编程语言或工具对获取的页面内容进行文本匹配或关键词搜索,以确定是否为404页面。
网页截图比对:使用自动化测试工具,如Selenium,可以模拟浏览器行为打开网页并截取页面截图。然后,你可以比对该截图与预期的404页面截图进行比对。如果它们相似度很高,则可能是404页面。
这些方法可以根据你的需求和技术背景进行选择和实施。需要注意的是,有些网页可能会使用JavaScript动态生成内容,这可能需要更高级的技术来处理。

什么是404界面

狭义的404界面就是http响应码返回404或503等不可达值的网页
广义的来说,404界面是一个统称,指的是协议404或者内容404

404页面有哪些特征

1、返回的httpcode是404/503/401等不可达code
2、title里面有”不存在“、”不可达“等关键词
3、内容里面有“不存在”、“找不到”等关键词
4、链接被重定向到了特定的404或503域名或页面
5、对于单个网站来说,所有的404页面结构比较统一

检测方案

针对上述404页面的特征,我们需要逐个实现

响应码返回404/503等

public Boolean checkHttpStatusCode(String code) {
   
        if (code.equals("404") || code.equals("503")) {
   
            return true;
        }
        return false;
    }

title里面有”不存在“、”不可达“等关键词

首先,我们使用jsoup库解析html,然后得到title标签里面的内容

public static String getHtmlTitle(String html){
   
        try {
   
            // 使用 Jsoup 解析 HTML
            Document doc = Jsoup.parse(html);

            // 获取 <title> 标签
            Element titleElement = doc.select("title").first();

            // 检查是否存在 <title> 标签并获取其内容
            if (titleElement != null) {
   
                String title = titleElement.text();
                return title;
            } else {
   
                return "";
            }
        } catch (Exception e) {
   
            e.printStackTrace();
        }
        return "";
    }

拿到title之后,我们再进行比对即可,利用java里面的contains方法即可

内容里面有“不存在”、“找不到”等关键词

首先需要获取到html里面的内容区,在没有使用智能提取技术之前,我们可以先去除标签获取内容,但是这确实是会带来很大的误报

import org.apache.commons.lang3.StringEscapeUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HtmlUtil {
   



    public static String delHTMLTag(String htmlStr) {
   
        String regEx_script = "<script[^>]*?>[\\s\\S]*?<\\/script>"; //定义script的正则表达式
        String regEx_style = "<style[^>]*?>[\\s\\S]*?<\\/style>"; //定义style的正则表达式
        String regEx_html = "<[^>]+>"; //定义HTML标签的正则表达式

        Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
        Matcher m_script = p_script.matcher(htmlStr);
        htmlStr = m_script.replaceAll(""); //过滤script标签

        Pattern p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
        Matcher m_style = p_style.matcher(htmlStr);
        htmlStr = m_style.replaceAll(""); //过滤style标签

        Pattern p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
        Matcher m_html = p_html.matcher(htmlStr);
        htmlStr = m_html.replaceAll(""); //过滤html标签

        return htmlStr.trim();
    }

    public static String htmlTextFormat(String htmlText) {
   
        htmlText = htmlText
                .replaceAll("(\\\\n)+", " ")
                .replaceAll("(\\\\t)+"," ")
                .replaceAll("(\t)+"," ")
                .replaceAll("(\n)+"," ");
        htmlText = htmlText.replaceAll(" +"," ");
        htmlText = htmlText.replaceAll(" +"," ");
        return htmlText;
    }

    public static String getContent(String html) {
   
        String ans = "";
        try {
   
            html = StringEscapeUtils.unescapeHtml4(html);
            html = delHTMLTag(html);
            html = htmlTextFormat(html);

            return html;
        } catch (Exception e) {
   
            e.printStackTrace();
        }
        return ans;
    }
}

上面的getContent方法便是我们获取到html内容的方法。

链接被重定向到了特定的404或503域名或页面

需要传入url,并对url进行解析

public class UrlPattern {
   
    private String pattern; // 正则
    private String description; // 描述
    private String location; // 位置
}

private Boolean checkOneUrlPattern(UrlPattern urlPattern, String url) {
   
        URL url1 = null;
        try {
   
            url1 = new URL(url);
        } catch (MalformedURLException e) {
   
            e.printStackTrace();
        }
        if (Objects.isNull(url1)) return false;
        Pattern pattern = Pattern.compile(urlPattern.getPattern());
        String val = "";
        if (urlPattern.getLocation().equalsIgnoreCase("path")) {
   
            val = url1.getPath();
        } else if (urlPattern.getLocation().equalsIgnoreCase("query")) {
   
            val = url1.getQuery();
        } else if (urlPattern.getLocation().equalsIgnoreCase("host")) {
   
            val = url1.getHost();
        }
        if (!StringUtils.hasText(val))return false;
        Matcher matcher = pattern.matcher(val);
        if (matcher.find()) {
   
            return true;
        }
        return false;
    }

UrlPattern 是定义的一套检测规则的对象类,以下是大概的格式

 - pattern: '\b(404|503)\b'
    description: '检测链接的域名部分包含404或503'
    location: 'host'

上述规则检测域名的host部分中是否有404或者503

对比页面结构,判定是否为404页面

这里有两个方案
方案一:自建404页面结构库,让用户调用时与我们的自建库进行比对
方案二:用户自己传入404页面和一个正常页面,我们利用页面结构相似度比较算法来确定是否为404页面

先来看下页面结构的算法

public class PageStructUtil {
   

    public static List<String> getAllLabelsFromHtml(String html) {
   
        Document document = Jsoup.parse(html);
        Elements elements = document.getAllElements();
        List<String> elementList = new ArrayList<>();
        for (Element element : elements) {
   
            elementList.add(element.nodeName());
        }
        return elementList;
    }


    /**
     * a 基于 base的相似性
     *
     * @param a
     * @param base
     * @return
     */
    public static Double pageStructScore(List<String> a, List<String> base) {
   
        SequenceUtils<String> stringSequenceUtils = new SequenceUtils<>();
        Integer length = stringSequenceUtils.getLongestCommonSequence(a, base);
        int n = base.size();
        int m = a.size();
        // TODO: 2020/5/25 定义:页面结构的相似度为 (2.0*公共序列的长度)/(旧的公共序列的长度+新的公共序列的长度)
        Double score = (2 * length) / ((n + m) * 1.0);
        return score;
    }


    public static void main(String[] args) {
   

    }

}

页面结构算法我在专栏的另外一篇博客中有专门讲解,请大家移步观看
然后,我们来看看调用的方法

/**
     * 自出404页面的页面结构分析
     *
     * @param user404Html
     * @param html
     * @param score
     * @return
     */
    public Boolean checkUserPage404Struct(String user404Html, String html, Double score) {
   
        try {
   
            return PageStructUtil.pageStructScore(PageStructUtil.getAllLabelsFromHtml(user404Html), PageStructUtil.getAllLabelsFromHtml(html)) >= score;
        } catch (Exception e) {
   
        }
        return false;
    }

优化迭代

检测配置化

由于上述写法中我们都是将检测的东西写死在程序中,不具有可扩展性,所以我们需要对此进行扩展,扩展的思路便是对于所有判断性条件都做成配置形式的,而不是走特判。
例如,我们可以对链接里面有404或503的编写如下的配置

rule_name: '检测链接的域名部分包含404或503'
url_patterns:
    - pattern: '\b(404|503)\b'
      description: '检测链接的域名部分包含404或503'
      location: 'host'

rule_name: '检测到路径中包含404或503'
url_patterns:
    - pattern: '\/(?:.*\/)?(404|503)\/'
      description: '检测到路径中包含404或503'
      location: 'path'

rule_name: '检测到查询字符串中包含404或503'
url_patterns:
    - pattern: '[?&](?:[^&=]+=[^&=]+&)*(?:[^&=]+=(404|503))(?:&|$)'
      description: '检测到查询字符串中包含404或503'
      location: 'query'

给title添加如下检测配置

404
503
页面未找到
服务不可用
错误
错误页面
访问被拒绝
权限拒绝
页面不存在
链接不存在
不存在
Not Found

http响应码的配置

404
503
401
400
500

页面结构的配置

rule_name: 'pan.baidu.com'
rules:
    - struct: '#document-html-head-body-meta-title-link-link-style-style-style-div-header-a-nav-a-span-div-a-em-div-div-a-span-span-a-span-span-a-span-span-a-span-span-a-span-span-a-span-span-a-span-span-a-span-span-iframe-div-ul-li-a-li-em-span-div-iframe-em-div-span-a-span-span-a-span-a-span-a-span-a-span-a-span-a-span-a-section-div-div-div-div-h3-div-p-p-p-div-p-a-p-a-style-div'
      score: '0.8'
      name: '404页面'
    - struct: '#document-html-head-body-title-meta-meta-meta-meta-meta-meta-meta-meta-link-link-link-link-link-link-link-link-link-style-link-link-link-link-style-style-style-style-div-div-div-div-dl-dt-a-dd-span-a-span-span-a-span-span-a-span-span-a-span-dl-dt-dd-span-a-p-span-a-p-span-a-p-span-a-p-span-a-p-span-a-p-span-a-p-span-a-p-span-a-p-span-a-p-dd-i-i-dd-span-span-i-i-span-a-i-dl-dt-i-i-span-span-i-i-span-span-a-p-i-span-dd-div-a-div-a-a-a-a-a-ul-li-a-li-a-li-a-li-a-span-span-li-a-li-a-i-a-a-i-a-div-div-div-span-a-div-span-dd-a-div-section-section-div-aside-dl-div-dl-div-a-p-p-a-p-p-a-p-p-a-p-p-div-div-div-img-div-section-link-div-div-a-a-a-a-a-a-a-style-div'
      score: '0.8'
      name: '链接失效页面'

接下来做的事儿

1、找到一堆404页面,得到其结构、title,响应码特征,丰富我们的上述配置
如何快速获取大量的404页面?可以找到一堆域名,然后添加一系列后缀(绝不可能存在的),得到的页面大概率就是404页面
2、对页面内容做智能解析提取,进而得到内容区的标题和正文,再进行进一步的分析。

目录
相关文章
|
Kubernetes 安全 Linux
【阿里云镜像】使用阿里巴巴开源镜像站镜像——Kubernetes 镜像
Kubernetes 是一个开源系统,用于容器化应用的自动部署、扩缩和管理。它将构成应用的容器按逻辑单位进行分组以便于管理和发现。
3774 0
【阿里云镜像】使用阿里巴巴开源镜像站镜像——Kubernetes 镜像
|
10月前
|
弹性计算 数据挖掘 测试技术
阿里云服务器2核8G、4核16G、8核32G配置热门实例性能、适用场景对于与选择参考
2025年,阿里云针对2核8G、4核16G、8核32G这三种主流配置,推出了一系列极具吸引力的活动,为用户提供了多样化的选择。目前,2核8G配置的云服务器活动价格为522.79元/年起,4核16G配置的云服务器活动价格为2149.92元/年起,而8核32G配置的云服务器活动价格则为4249.44元/年起。这些价格涵盖了经济型e、通用算力型u1、通用型g8i、通用型g7和通用型g8y等不同实例规格,为用户提供了多样化的选择。本文将对这些配置热门实例规格的实例性能、适用场景和活动价格做个对比,以供选择和参考。
|
Python
md文件格式转成word文档
md文件格式转成word文档
1481 1
|
JavaScript 持续交付 Docker
解锁新技能:Docker容器化部署在微服务架构中的应用
【10月更文挑战第29天】在数字化转型中,微服务架构因灵活性和可扩展性成为企业首选。Docker容器化技术为微服务的部署和管理带来革命性变化。本文探讨Docker在微服务架构中的应用,包括隔离性、可移植性、扩展性、版本控制等方面,并提供代码示例。
406 1
|
机器学习/深度学习 人工智能 达摩院
覆盖200+服务场景,阿里「通义」大模型系列打造国内首个AI统一底座
在大模型领域,阿里持续发力,用技术和思路创新走出一条不一样的路。
10310 129
覆盖200+服务场景,阿里「通义」大模型系列打造国内首个AI统一底座
|
运维 应用服务中间件 持续交付
《Ansible之道:用Roles打造高效、可重用的自动化运维流程》
【8月更文挑战第13天】在自动化运维领域,Ansible以简洁的YAML语法和强大功能著称。其“角色”(Roles)机制进一步提升了效率,通过将相关任务、文件和模板集中管理,实现特定功能的快速部署。本文介绍Roles的基本结构及应用示例,包括创建角色、定义任务如安装Nginx和复制网页文件等,并通过Playbook调用角色完成Web服务器的自动化部署。Roles不仅提高代码重用性和可移植性,还简化了运维流程,是构建标准化、模块化部署方案的关键技能。
368 0
|
机器学习/深度学习 数据采集 PyTorch
构建高效 PyTorch 模型:内存管理和优化技巧
【8月更文第27天】PyTorch 是一个强大的深度学习框架,被广泛用于构建复杂的神经网络模型。然而,在处理大规模数据集或使用高性能 GPU 进行训练时,有效的内存管理对于提升模型训练效率至关重要。本文将探讨如何在 PyTorch 中有效地管理内存,并提供一些优化技巧及代码示例。
1763 1
|
Web App开发 算法
软件破解初级实例教程(附工具附图)
最近在群里总是看到很多新朋友在问: 1、“新手怎么学破解啊?”(这是标准的伸手党,baidu google其实很好用) 2、“哎呀XX大牛,我什么基础都没有啊我不会汇编,不会C更不会C++还不会…………总之高手会的我都不会,我能学么?”(明确的告诉你,你能!你不和唐僧一样罗嗦的话你一定能。
12399 1
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版7(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版7(附带项目源码)
351 0