在静态网站中本地检查死链接(使用wget?)

Mat*_*Moy 13 python wget hyperlink http-status-code-404

检查死链接的非常好的工具(例如指向404错误的链接)是wget --spider.但是,我有一个稍微不同的用例,我生成一个静态网站,并希望在上传之前检查损坏的链接.更确切地说,我想检查两者:

  • 相关链接就像 <a href="some/file.pdf">file.pdf</a>

  • 绝对链接,最有可能是外部网站<a href="http://example.com">example</a>.

我试过wget --spyder --force-html -i file-to-check.html,它读取本地文件,将其视为HTML并跟随每个链接.不幸的是,它无法处理本地HTML文件中的相对链接(错误输出Cannot resolve incomplete link some/file.pdf).我试过使用file://wget不支持它.

目前,我有一个基于运行本地Web服务器python3 http.serve并通过HTTP检查本地文件的hack :

python3 -m http.server &
pid=$! 
sleep .5
error=0
wget --spider -nd -nv -H -r -l 1 http://localhost:8000/index.html || error=$? 
kill $pid
wait $pid
exit $error
Run Code Online (Sandbox Code Playgroud)

由于以下几个原因,我对此并不满意:

  • 我需要这个sleep .5等待网络服务器准备好.如果没有它,脚本会失败,但我无法保证0.5秒就足够了.我更愿意wget在服务器准备就绪时启动命令.

  • 相反,这kill $pid感觉很难看.

理想情况下,python3 -m http.server可以选择在服务器就绪时运行命令,并在命令完成后自行关闭.通过编写一些Python听起来可行,但我想知道是否存在更清晰的解决方案.

我错过了什么吗?有更好的解决方案吗?我wget在我的问题中提到它因为它几乎完全符合我的要求,但使用wget并不是我的要求(也不是python -m http.server).我只需要在Linux上运行和自动化.

Tar*_*ani 10

所以我认为你正朝着正确的方向前进.我会使用wget,python因为它们是许多系统上的两个随时可用的选项.而最重要的是它可以为您完成工作.现在你想要的是Serving HTTP on 0.0.0.0stdout那个过程中聆听.

所以我会使用下面的内容开始这个过程

python3 -u -m http.server > ./myserver.log &
Run Code Online (Sandbox Code Playgroud)

注意-u我在这里用于无缓冲输出,这非常重要

现在接下来正在等待此文本出现 myserver.log

timeout 10 awk '/Serving HTTP on 0.0.0.0/{print; exit}' <(tail -f ./myserver.log)
Run Code Online (Sandbox Code Playgroud)

所以10秒是你最长的等待时间.休息是不言自明的.接下来关于你的kill $pid.我不认为这是一个问题,但如果你想让它更像用户的方式那么我会把它改成

kill -s SIGINT $pid
Run Code Online (Sandbox Code Playgroud)

这相当于CTRL+C启动程序后的处理.我也会SIGINT使用下面的内容来处理我的bash脚本

https://unix.stackexchange.com/questions/313644/execute-command-or-function-when-sigint-or-sigterm-is-send-to-the-parent-script/313648

以上基本上添加到bash脚本的顶部以处理你使用CTRL+C或外部kill信号杀死脚本

#!/bin/bash
exit_script() {
    echo "Printing something special!"
    echo "Maybe executing other commands!"
    trap - SIGINT SIGTERM # clear the trap
    kill -- -$$ # Sends SIGTERM to child/sub processes
}

trap exit_script SIGINT SIGTERM
Run Code Online (Sandbox Code Playgroud)