YOLO813

利用Ping向谷歌提交站点地图

    之前在提交站点地图到search console时,由于数据太多,而sitemap的标准是单页不超过1万条数据,所以提交的是站点地图索引,这原本没什么问题,但是由于我自己的一些强迫症,把站点地图给删除了,后来换了网址重新进行了提交,这就出现了问题,具体的表现为站点地图索引子页面“无法获取”

    大概在一个月之后,整个网站的展现量直接腰斩

    整个人直接懵逼,连续持续了两个多月不见回升,后来陆续找到一些办法来重新提交站点地图,例如,除了提交站点地图索引,还手动提交站点地图索引的子页面,这一点可以通过观察web服务器的日志来检测,当我提交站点地图到SC中时,可以看到日志多了一条访问记录,状态码为200,随后SC中的状态转变为成功。

    但是,手动提交的方法终究还是比较累人,可以考虑使用程序来处理,我能想到有两种,一种是利用selenium控制浏览器模拟人工提交,这种方法会导致占用一条站点地图的名额(似乎超过1000条站点地图会导致谷歌不再抓取,未考证);另外一种就是谷歌提供了一种Ping工具,通过命令行发送get请求即可(不会占用SC中的站点地图名额),同样可以查看web服务器日志观察是否抓取成功

https://www.google.com/ping?sitemap=FULL_URL_OF_SITEMAP

    这种可以使用python来写,将所有未成功的站点地图整合到一个文件中,再使用request函数完成提交;为了迁移的方便性,我还是打算使用shell脚本来尝试一下。

    首先我们可以使用tail工具跟踪web服务器的日志,再来测试curl提交的返回值

curl -X GET https://www.google.com/ping?sitemap=FULL_URL_OF_SITEMAP

    随后在web服务器日志中可以发现search console抓取的记录,再去刷新search console的站点地图功能,发现“无法获取”转为“成功”。因此这种命令行形式是可行的,开始写shell脚本。

    直接上代码吧

#!/bin/bash
# author: zxf
# func: post url to search console by Ping

google_url="https://www.google.com/ping?sitemap=FULL_URL_OF_SITEMAP?p="
date_China=`TZ="Asia/Shanghai" date  +%Y%m%d-%H:%M:%S`
sitemap_array=(500 501)

log_file=/root/sitemap_log.log;
if [ -e $log_file ]  # -e file existed?
then
        echo "$log_file existed"
else
        touch $log_file
fi

for var in ${sitemap_array[*]}
do
        echo -e "${date_China}\n${google_url}${var}">>$log_file;
        curl -s -X GET ${google_url}${var} >> $log_file;
        echo -e "\n\n" >>$log_file;
        sleep 30;
done

    稍微解释一下上面的代码,date_China变量用于记录时间变量,方便我自己在日志中检查,由于我的服务器时间是零时区,所以在date函数中定义了东八区的时间,需要注意,shell脚本的变量定义不要在赋值号左右添加空格(对于写python的人来说,这可真是个大坑),

    随后定义了一个数组列表,方便后面组合url,shell中的数组之间采用空格分割;log_file定义了日志存放路径(建议是绝对路径,如果打算让程序定时运行的话);紧接着判断文件是否存在,不存在则创建文件;之后再通过for循环取出${sitemap_array[*]}数组的每个值(变量名${var}等价于$var),数组的所有值可以使用${list[@]}或${list[*]}来取得;随后使用curl静默的调用GET请求提交网址,并且每个网址提交间隔30秒。

# 后台运行
nohup /bin/bash postSitemap.sh >>/dev/null &

    这么一看,代码量似乎跟python的差不多啊,但是shell脚本迁移远比python简单,该代码直接复制粘贴到任一linux服务器均可。

    如果想要解决代码间的耦合问题,可以考虑新建一个文件专用于定义数据,例如

#!/bin/bash
while read line
do
    echo $line
done < test.txt


备注

# 时区问题
https://blog.humh.cn/?p=795
# shell流程控制
https://www.runoob.com/linux/linux-shell-process-control.html
https://zhuanlan.zhihu.com/p/264346586