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

2024-05-14 21:34:26 发布

您现在位置:Python中文网/ 问答频道 /正文

检查死链接(例如指向404个错误的链接)的一个非常好的工具是^{}。然而,我有一个稍微不同的用例,我生成一个静态网站,并希望在上传之前检查断开的链接。更确切地说,我想检查一下:

  • 相对链接,如<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不支持它。在

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

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

我对此不太满意,原因有几个:

  • 我需要这个sleep .5来等待web服务器准备就绪。如果没有它,脚本将失败,但我不能保证0.5秒就足够了。我希望有一种方法可以在服务器准备就绪时启动wget命令。

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

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

我错过了什么?有更好的解决办法吗?我在我的问题中提到wget,因为它几乎可以满足我的需要,但是使用wget对我来说并不是一个要求(python -m http.server)。我只需要在Linux上运行和自动化一些简单的东西。在


Tags: 文件命令服务器httpserverpdf链接html
2条回答

所以我认为你的方向是正确的。我将使用wget和{},因为它们是许多系统上两个现成的选项。好在它能帮你完成任务。现在您需要的是从该进程的stdout中监听Serving HTTP on 0.0.0.0。在

所以我会用下面的方法开始这个过程

python3 -u -m http.server > ./myserver.log &

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

现在,next正在等待此文本出现在myserver.log

^{pr2}$

所以10秒是您在这里的最大等待时间。剩下的是不言而喻的。接下来是关于你的kill $pid。我不认为这是一个问题,但如果你想让它更像一个用户的方式,那么我会改变它

kill -s SIGINT $pid

这相当于启动程序后处理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

TarunLalwani的答案是正确的,按照给出的建议,可以编写一个简洁的shell脚本(依赖于Python和awk)。另一个解决方案是完全用Python编写脚本,给出一个稍微更详细但可以说更干净的脚本。服务器可以在一个线程中启动,然后执行检查网站的命令,最后关闭服务器。我们不再需要解析文本输出,也不需要向外部进程发送信号。因此,脚本的关键部分是:

def start_server(port,
                 server_class=HTTPServer,
                 handler_class=SimpleHTTPRequestHandler):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    thread = threading.Thread(target=httpd.serve_forever)
    thread.start()
    return httpd

def main(cmd, port):
    httpd = start_server(port)
    status = subprocess.call(cmd)
    httpd.shutdown()
    sys.exit(status)

我编写了一个稍微更高级的脚本(在此基础上进行了一些命令行选项解析),并将其发布为:https://gitlab.com/moy/check-links

相关问题 更多 >

    热门问题