百度站长工具提供了三种自动提交链接的方法,分别是主动推送、自动推送和 sitemap。
填 sitemap 最方便,但是效果很差。我提交的 sitemap 的最后抓取时间是 2019-06-22,已经有半个多月没有抓取,即使我去后台点击「手动更新文件」也无济于事,其状态一直是「等待」。
自动推送需要在页面上添加由百度提供的一段 JS。这种办法至少有以下缺点:
- 让页面体积变大
- 这段 JS 代码可能会被浏览器扩展屏蔽
- 这段 JS 代码来自百度
只好再尝试主动推送了。
今天无奈地写了一个脚本,向百度主动推送网站的各个 URL。实际上所有 URL 还是来自网站的 sitemap。
#!/bin/bash
set -o errexit
BAIDU_URL="http://data.zz.baidu.com/urls"
BAIDU_TOKEN="XXXXXXXXXXX" # replace with your own token
CURL="/usr/bin/curl"
XMLLINT="/usr/bin/xmllint"
URL_TEMP=$(mktemp /tmp/url_XXXXXXXXX)
XML_TEMP=$(mktemp /tmp/xml_XXXXXXXXX)
function green {
local green="\033[0;32m"
local end="\033[0m"
echo -e -n "${green}${1}${end}"
}
function download {
local website=$1
local xml_url="$website/sitemap.xml"
green "downloading $xml_url..."
$CURL "$xml_url" > "$XML_TEMP" 2>/dev/null
green "done\n"
}
function push {
local website=$1
local count=0
count=$(wc -l "$URL_TEMP" | awk '{print $1}')
if [[ $count -gt 0 ]]; then
green "pushing $count urls to baidu\n"
$CURL -H 'Content-Type:text/plain' --data-binary @"$URL_TEMP" "${BAIDU_URL}?site=${website}&token=${BAIDU_TOKEN}"
else
echo "nothing to push"
fi
}
function parse {
local file=$1
$XMLLINT --format "$file" | grep loc | cut -d '>' -f2 | cut -d ' "$URL_TEMP"
}
function protocol {
local website=$1
if [[ ${website:0:4} != "http" ]]; then
echo "https://$website"
else
echo "$website"
fi
}
function clean {
rm "$XML_TEMP"
rm "$URL_TEMP"
echo ""
green "byebye"
echo ""
}
function main {
local website=$1
if [[ "x$website" = "x" ]]; then
echo "no website"
exit -1
fi
website=$(protocol "$website")
echo "website: $website"
download "$website"
parse "$XML_TEMP"
push "$website"
clean
}
main "$@"
写了那么多,其实核心就是使用 xmllint 那句,把 URL 从 XML 文件中取出来。本想用 xpath 直接获取 sitemap.xml 里的各个链接内容,摸索了半个小时也没弄成,索性改成粗暴的做法,也就是现在脚本里由管道串起来的一个个 grep 和 cut 命令。
百度站长工具的「主动推送」有推送数据、更新数据和删除数据三个接口,我这个博客的链接并不多,所以我只用了推送数据这一个接口,每次都推全量的 URL。
做主动推送的主要原因是这个博客在百度的收录量太少,而这个「主动推送」呢,也只是死马当活马医。
当前,2019 年 7 月 9 日,这个博客在百度的收录(站长工具后台查看)仅仅是 70 左右,在百度搜索 site:ifttl.com
有 52 个结果,而在 Google 和 Bing 的搜索结果分别有 245 和 148 个。
最后差点忘了,在 crontab 里加上一条,每天定时往百度 push 一把。
05 10 * * * /path/to/the/script/push_to_baidu.sh ifttl.com > /dev/null 2>&1