1

我发现这个 bash 脚本可以检查文本文件中 URL 的状态,并在重定向时打印目标 URL:

#!/bin/bash
while read url
do
    dt=$(date '+%H:%M:%S');
    urlstatus=$(curl -kH 'Cache-Control: no-cache' -o /dev/null --silent --head --write-out '%{http_code} %{redirect_url}' "$url" )
    echo "$url $urlstatus $dt" >> urlstatus.txt

done < $1

我不太擅长 bash:我想为每个 url 添加它的 Robots 元标记的值(如果存在)

4

2 回答 2

1

实际上,我真的建议使用 DOM 解析器(例如 Nokogiri、hxselect 等),但是您可以这样做(例如处理以机器人属性内容的值开头的行<meta并“提取”机器人的属性内容的值):

curl -s "$url" | sed -n '/\<meta/s/\<meta[[:space:]][[:space:]]*name="*robots"*[[:space:]][[:space:]]*content="*\([^"]*\)"*\>/\1/p'

如果不可用,这将打印属性的值或空字符串。

你需要一个纯 Bash 解决方案吗?或者你有sed吗?

于 2019-11-06T10:10:23.883 回答
0

您可以添加一行以从页面的源代码中提取机器人的元标题,并使用echo修改该行以显示其值:

#!/bin/bash
while read url
do
    dt=$(date '+%H:%M:%S');
    urlstatus=$(curl -kH 'Cache-Control: no-cache' -o /dev/null --silent --head --write-out '%{http_code} %{redirect_url}' "$url" )
    metarobotsheader=$(curl -kH 'Cache-Control: no-cache' --silent "$url" | grep -P -i "<meta.+robots" )
    echo "$url $urlstatus $dt $metarobotsheader" >> urlstatus.txt
done < $1

此示例记录了带有robots标题的原始行。

如果你想在页面没有机器人标题时打一个标记“-”,你可以换metarobotsheader行,把这个:

    metarobotsheader=$(curl -kH 'Cache-Control: no-cache' --silent "$url" | grep -P -i "<meta.+robots" || echo "-")

如果要提取属性的确切值,可以更改该行:

    metarobotsheader="$(curl -kH 'Cache-Control: no-cache' --silent "$url" | grep -P -i "<meta.+robots" | perl -e '$line = <STDIN>; if ( $line =~ m#content=[\x27"]?(\w+)[\x27"]?#i) { print "$1"; } else {print "no_meta_robots";}')"

当 URL 不包含机器人的任何标头时,它将显示no_meta_robots

于 2019-11-06T12:23:58.493 回答