用于检查 URL 何时更新的命令行工具?

用于检查 URL 何时更新的命令行工具?

当然可以在 Python 中组合一些东西来查询 URL,以查看它上次修改的时间,使用 HTTP 标头,但我想知道是否有现有的工具可以为我做到这一点?我会想象这样的事情:

% checkurl http://unix.stackexchange.com/questions/247445/
Fri Dec  4 16:59:28 EST 2015

或者可能:

% checkurl "+%Y%m%d" http://unix.stackexchange.com/questions/247445/
20151204

作为铃声和/或口哨声。我认为 wget 或 curl 没有我需要的东西,但如果被证明是错误的,我不会感到惊讶。那里有这样的东西吗?

答案1

这似乎符合您的要求(更新为使用 '\r\n' 作为响应数据的记录分隔符):

#!/bin/sh

get_url_date()
{
    curl --silent --head "${1:?URL ARG REQUIRED}" | 
    awk -v RS='\r\n' '
        /Last-Modified:/ {
            gsub("^[^ ]*: *", "")
            print
            exit
        }
    '
}

unset date_format
case $1 in
    (+*)
        date_format="$1"
        shift
        ;;
esac

url_date="$(get_url_date "${1:?URL ARG REQUIRED}")"

if [ -z "$url_date" ]
then
    exit 1
fi

if [ "$date_format" != "" ]
then
    date "$date_format" -d"$url_date"
else
    echo "$url_date"
fi

答案2

Perl 一行代码:

% perl -MLWP::Simple -MDate::Format -e 'print time2str "%C\n", (head $ARGV[0])[2]' http://example.com
Sat Aug 10 02:54:35 EEST 2013

在现代 Linux 或 FreeBSD 系统上,它所需的模块可能已经安装。

答案3

事实证明,curl 和 wget 都可以做到这一点,但毕竟在 Python 中可能值得这样做。这是我最终写的:

#!/usr/bin/env python3

import sys, dateutil.parser, subprocess, requests
from getopt import getopt

errflag = 0
gTouch = None
gUsage = """Usage: lastmod [-t file] url
where:
-t file     Touches the given file to make its modification date
            the same as the URL modification date.
url         A URL to be retrieved
"""

opts, args = getopt(sys.argv[1:], "t:v?")

for k, v in opts:
    if k == "-t":           # File to touch
        gTouch = v
    elif k == "-?":         # Write out usage and exit
        errflag += 1

if len(args) != 1:
    errflag += 1

if errflag:
    sys.stderr.write(USAGE)
    sys.exit(1)

res = requests.head(args[0])

if res.status_code != 200:
    sys.stderr.write("Failed to retrieve URL\n")
    sys.exit(1)

if not 'Last-Modified' in res.headers:
    sys.stderr.write("Headers has no last-modified date\n")
    sys.exit(1)

dt = dateutil.parser.parse(res.headers['Last-Modified'])

if gTouch:
    subprocess.call(["touch", "-t", dt.strftime("%Y%m%d%H%m"), gTouch])
else:
    sys.stdout.write("%s\n" % dt.ctime())

答案4

查看Carbon14;它是一个命令行 python 工具,用于从图像中检测网页历史记录。如果您的检查网页上有一些图像,则效果很好。安装自Carbon14 Github 存储库,安装后运行;

python carbon14.py <url>

相关内容