如何:在指定的时间间隔内从 Wayback Machine 下载页面

orl*_*lla 11 webpage download wget

我的意思是在指定的时间段和间隔内从 Wayback Machine 下载可用的每个页面。例如,我想从 2012 年 1 月到 2012 年 12 月从 Nature.com 下载每天可用的每个页面。(这不完全是我想要做的,但已经足够接近了——并且提供了一个很好的例子。)

不幸的是,由于 Wayback 机器工作方式的独特性,wget 将无法工作。

Wayback Machine 下载器之类的工具似乎只能下载该页面的最新版本。

与 IA API 交互似乎是一条可行的途径,但我不确定这将如何运作。

谢谢!

Sam*_*een 6

该方式wayback的URL的格式如下:

http://$BASEURL/$TIMESTAMP/$TARGET
Run Code Online (Sandbox Code Playgroud)

BASEURL通常是http://web.archive.org/web(我通常说是因为我不确定它是否是唯一的 BASEURL)

TARGET是不言自明的(在您的情况下http://nature.com,或一些类似的 URL)

TIMESTAMPYYYYmmddHHMMss捕获的时间(UTC):

  • YYYY: 年
  • mm: 月 (2 位数字 - 01 到 12)
  • dd:月中的第几天(2 位数字 - 01 到 31)
  • HH: 小时 (2 位数字 - 00 到 23)
  • MM:分钟(2 位数字 - 00 到 59)
  • ss:秒(2 位数字 - 00 到 59)

如果您请求的捕获时间不存在,回溯机器将重定向到该 URL 的最近捕获,无论是在未来还是过去。

您可以使用该功能使用curl -I(HTTP HEAD)获取每个每日 URL以获取一组 URL:

BASEURL='http://web.archive.org/web'
TARGET="SET_THIS"
START=1325419200 # Jan 1 2012 12:00:00 UTC (Noon) 
END=1356998400 # Tue Jan  1 00:00:00 UTC 2013
if uname -s |grep -q 'Darwin' ; then
    DATECMD="date -u '+%Y%m%d%H%M%S' -r "
elif uname -s |grep -q 'Linux'; then
    DATECMD="date -u +%Y%m%d%H%M%S -d @"
fi


while [[ $START -lt $END ]]; do
    TIMESTAMP=$(${DATECMD}$START)
    REDIRECT="$(curl -sI "$BASEURL/$TIMESTAMP/$TARGET" |awk '/^Location/ {print $2}')"
    if [[ -z "$REDIRECT" ]]; then
        echo "$BASEURL/$TIMESTAMP/$TARGET"
    else
        echo $REDIRECT
    fi
    START=$((START + 86400)) # add 24 hours
done
Run Code Online (Sandbox Code Playgroud)

这将为您提供最接近 2012 年中午的 URL。只需删除重复项,然后下载页面。

注意:上面的脚本可能可以大大改进以REDIRECT在将来超过 1 天的 URL 的情况下向前跳转,但是它需要解构返回的 URL,并调整START为正确的日期值。