如何使用Shell脚本确定网页是否存在?

64

我正在尝试制作一个程序,将一系列漫画扫描转换为一个pdf文件,我不想尝试下载图片以确定我是否拥有正确的URL。有没有shell脚本命令可以用来检查网页是否存在?


哪个shell?UNIX shell?Windows命令提示符?Windows Powershell? - zneak
我猜是UNIX,因为它有一个UNIX标签。 - thepiercingarrow
6个回答

116

在 *NIX 下,你可以使用 curl 发送一个简单的 HEAD 请求(HEAD 只会请求响应头部,而非页面主体内容):

curl --head http://myurl/

然后你可以仅获取第一行,其中包含HTTP状态码(200 OK、404 Not Found等):

curl -s --head http://myurl/ | head -n 1

然后检查您是否获得了良好的响应(状态码为200或3 **):

curl -s --head http://myurl/ | head -n 1 | grep "HTTP/1.[01] [23].."

如果状态码正常,这将输出第一行内容;否则不会有任何输出。您也可以将其导入 /dev/null 中以获取无输出,并使用 $? 确定是否工作正常:

curl -s --head http://myurl/ | head -n 1 | grep "HTTP/1.[01] [23].." > /dev/null
# on success (page exists), $? will be 0; on failure (page does not exist or
# is unreachable), $? will be 1

编辑-s 只是告诉 curl 不要显示 "进度条"。


5
为了实现更少的字符串解析,并检查重定向到不存在的页面,使用以下命令:curl --silent --head --location --output /dev/null --write-out '%{http_code}' http://en.wikipedia.org/wiki/tla | grep '^2' - bukzor
自动化验证多个文件的脚本:https://gist.github.com/igilham/12eb33ab8a86f1e815d2 - Ian Gilham
3
根据我的经验,我知道加上 --connect-timeout <秒数> 选项是值得的。 - patryk.beza
1
@MarkWright,让我回家后检查一下UNIX系统。 - zneak
1
@MarkWright,我在OS X和Ubuntu 15.04上都无法重现你的问题。你有更多的上下文吗? - zneak
显示剩余2条评论

26

使用 cURL 获取状态码并检查所需的值。

status=$(curl -s --head -w %{http_code} http://www.google.com/ -o /dev/null)
echo $status

15

首先确保没有授权问题。如果需要授权,请提供用户名和密码。创建一个名为checkURL.sh的shell脚本文件,并粘贴以下代码。

希望这可以帮助您。

checkURL.sh

yourURL="http://abc-repo.mycorp.com/data/yourdir"

if curl --output /dev/null --silent --head --fail "$yourURL"
then
    echo "This URL Exist"
else
    echo "This URL Not Exist"
fi

它在Nexus和其他仓库中为我工作。


4

你总是可以使用wget;我这样做是因为代码更简单。

 if [[ $(wget http://url/ -O-) ]] 2>/dev/null
  then echo "This page exists."
  else echo "This page does not exist."
 fi

使用wget命令的-O-选项表示尝试输出页面内容,但仅当该页面存在时才能输出。因此,如果没有任何输出,则该页面不存在。2>/dev/null只是将输出(如果有的话)发送到垃圾箱。我知道这可能有些晚了,但希望对您有所帮助。

0

Wget有一个有效的功能,使用其--spider参数可以实现此目的。如果找到网页,则返回代码为0。对于其他错误,返回代码大于0。

例如:

URL="http://www.google.com"

if wget --spider "$URL" 2>/dev/null; then
    echo "$URL web-page exists !"
else
    echo "$URL web-page does NOT exists !"
fi

-1

wgetcURL 可以完成这项工作。请查看此处 wgetcURL 获取详细信息和下载位置。提供这些命令行工具的 URL 并检查响应。


为什么会有人点踩呢(注意,没有任何解释),如果答案是正确的、简洁的和信息量丰富的呢? - Jochem Schulenklopper
2
我没有点踩,但是如果我猜的话,可能是因为只有URL的答案是不被鼓励的。 - zneak
谢谢。说实话,问题是“是否有一个shell脚本命令可以用来检查网页是否存在?”我的答案是“wget或cURL都可以完成任务”,并附上每个命令的链接和解释,这些命令调用的响应可以被检查。这不是仅限于URL的答案,无论如何,它与当时发布的另一个答案(修订版)一样具有信息量:https://stackoverflow.com/revisions/2924444/1。可惜,显然是个倒霉的日子 :-) - Jochem Schulenklopper
1
是的,说到这一点,通常的做法是尽快发布最简单的答案,并在5-10分钟内通过编辑进行扩展。实际上,该帖子的第二个版本基本上已经完成(第三个版本添加了有关-s开关的单个解释行),提交时间比原始版本早6分钟。当然,当人们稍后在搜索引擎上找到问题时,他们不会有那种修订的敏感性。 :) - zneak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接