最近在折腾博客主题,通常来说大多数人认为换主题会影响 SEO,实际上只要你把工作都做到位了,是没有任何问题的。比如,换主题后你得仔细检查标题和描述等内容是否发生改变、换主题后是否带来了大量的 404 页面等。当然,更细微的可能是换主题之后,网站的内链网络也发生了微妙的改变,但是整体的影响较小。
总之,张戈博客这次更换主题基本上没有看到明显的 SEO 影响,反而出现几个新的关键词。好了,题外话到此结束,下面分享一下从 Nginx 日志分析并生成能提交到搜索引擎的死链文件的 Shell 脚本。
一、前因后果
今天在看百度站长平台的抓取频次的时候,发现最近抓取次数有所下滑,并且平均响应时间也有所上升,感觉和最近频繁折腾主题以及访问量增加有所关系:
这个问题倒是好解决,等主题稳定了,页面静态缓存文件也就不会频繁被手工删除,整个网站的抓取响应时间应该就能回到正常水平。
再往下看,却发现网站抓取中出现的 404 数据也呈上升趋势:
实际上,张戈博客以前是手动提交过死链文件的,但后来没时间也就没去搭理更新了。看来这个工作还得重新做起来,并且实现自动化才行了。
二、Shell 脚本
说做就做,简单的写了个 Shell 脚本就搞定了!
脚本名称:网站死链生成脚本
脚本功能:每天定时分析网站前一天的 nginx 日志, 然后提取状态码为 404 并且 UA 为百度蜘蛛的抓取路径,并写入到网站根目录下的 death.txt 文件,用于提交百度死链。
脚本代码:
#!/bin/bash #Desc: Death Chain File Script #Author: ZhangGe #Blog: https://zhang.ge/5038.html #Date: 2015-05-03 #初始化变量 #定义蜘蛛 UA 信息(默认是百度蜘蛛) UA='+http://www.baidu.com/search/spider.html' #前一天的日期(nginx 日志) DATE=`date +%Y-%m-%d -d "1 day ago"` #定义日志路径 logfile=/home/wwwlogs/zhang.ge_${DATE}.log #定义死链文件存放路径 deathfile=/home/wwwroot/zhang.ge/death.txt #定义网站访问地址 website=https://zhang.ge #分析日志并保存死链数据 for url in `awk -v str="${UA}" '$9=="404" && $15~str {print $7}' ${logfile}` do grep -q "$url" ${deathfile} || echo ${website}${url} >>${deathfile} done
使用说明:
①、脚本适用于每天都做了日志切割的 Nginx,没有做的朋友可以参考博客之前的文章:
②、将代码保存为 shell 脚本,比如 deathlink.sh,然后如下建立任务计划:
#执行如下命令编辑任务计划 [[email protected]_Server ~]# crontab -e #每天凌晨 1 点执行此脚本(注意脚本的实际路径) 0 1 */1 * * /root/death.sh >/dev/null 2>&1 #按下 ESC,然后键入 :wq 保存并退出
③、执行后,将在网站根目录生成死链文件:death.txt,可以浏览器访问看看内容,比如:
④、前往立即前往提交这个死链文件即可:
这样一来,系统会每天执行脚本,将昨天的百度蜘蛛爬到的 404 路径保存到网站根目录下的 death.txt,以备百度死链抓取工具前来抓取。
效果截图:
下面贴上这几天死链抓取(百度定时抓取,无需人工干预)及处理情况,效果还是非常明显的:
值得说明的是,这些死链记录是累加的,已保存的死链数据,就算百度蜘蛛不爬了也会继续保存,需要人工清理,不过一般不清理也没啥问题。
注意事项:
①、如果你的 nginx 服务 并没有配置相应的 access 日志,请自行在 server 下添加所需网站的 access 日志,否则脚本无法使用;
②、脚本适用的 access 日志格式如下:
log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for';
如果和你的不一样,则需要修改脚本中的 awk 指定的域(即$9、$15 以及$7)。
三、其他拓展
①、如果你之前没有做过 Nginx 日志切割,那么可以直接用下面这个脚本来一次性搞定:
#!/bin/bash #Desc: Cut Nginx Log and Create Death Chain File #Author: ZhangGe #Blog: https://zhang.ge/5038.html #Date: 2015-05-03 #①、初始化变量: #定义 access 日志存放路径 LOGS_PATH=/home/wwwlogs #定义蜘蛛 UA 信息(默认是百度蜘蛛) UA='+http://www.baidu.com/search/spider.html' #定义网站域名(需要先给相应的网站以域名形式配置了 nginx 日志,比如 zhang.ge.log) DOMAIN=zhang.ge #定义前一天日期 DATE=`date +%Y-%m-%d -d "1 day ago"` #定义日志路径 logfile=/home/wwwlogs/zhang.ge_${DATE}.log #定义死链文件存放路径 deathfile=/home/wwwroot/zhang.ge/death.txt #定义网站访问地址 website=https://zhang.ge #②、Nginx 日志切割 mv ${LOGS_PATH}/${DOMAIN}.log ${LOGS_PATH}/${DOMAIN}_${DATE}.log kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'` #可选功能: 自动删除 30 天之前的日志,可自行修改保存时长。 cd ${LOGS_PATH} find . -mtime +30 -name "*20[1-9][3-9]*" | xargs rm -f #③、网站死链生成(百度专用) #分析日志并保存死链数据 for url in `awk -v str="${UA}" '$9=="404" && $15~str {print $7}' ${logfile}` do grep -q "$url" ${deathfile} || echo ${website}${url} >>${deathfile} done
②、其他 WEB 服务器,比如 Apache 或 IIS,只要参考脚本思路,修改成实际的路径或日志字段,同样可以写一个相同功能的 Shell 或 Batch 脚本,有需求的朋友自己去研究折腾吧!
好了,本文暂时就分享这么多,希望对你有所帮助!
你真的太强悍了!百度做到 pr5了!!学习收藏了!
个人博客做到那么高的权重很不容易呀
签到成功!签到时间:上午9:24:55,每日签到,生活更精彩哦~
强悍,大神不愧为大神
文章写的不错,学习到了很多。
很棒~写的很详细,可以学到很多
学到了 404 可以这样处理
请教 运行脚本提示这个错误是什么意思啊
代码贴过去不对吧,要么就是系统兼容性问题,玩网站、玩服务器还是用centos比较好,大部分教程基于centos写的,你这个是debian
写的很详细很不错,404页面在网站中也是很重要的
每一篇博客,都是精品,值得品鉴 :grin:
宝塔面板生成不了404文件文档,代码如下
补充一下上一句评论:
宝塔面板生成不了404文件文档,
日志格式如下
脚本代码如下