识别自定义 404 页面

经常遇到这种情况:访问某个网站的页面,提示找不到该页,但返回的状态码不是404。这时就不好直接通过状态码判断了。

可以用相似度来解决这个问题:

1、向目标网站发出个“绝对”不存在的路径请求,得到自定义 404 页面的 HTML 代码;

2、用当前的 HTML 代码和之前得到的 404 页面代码做相似度运算,相似度达到某个值(比如 95%)的时候,就说明是 404。

import difflib


def is_custom_40x(url, html):
    """404自定义错误页面检测
    请求一个“绝对”不存在的页面,得到返回的内容,然后再请求指定的 url,将两个结果做相似度算法,相似度高达 90% 以上说明是自定义 404
    Return: 404 -> True, else -> False
    """
    seq = difflib.SequenceMatcher()
    req = urllib.Request('http://%s/never_exists_dir_xxxxxx' % url, headers=headers)
    sock = urllib.urlopen(req)
    _404code = sock.read()

    seq.set_seq1(_404code)
    seq.set_seq2(html)

    similarity = seq.quick_ratio() * 100

    return similarity > 90 and True or False