百度站长工具提供了三种自动提交链接的方法,分别是主动推送、自动推送和 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