之前写过一篇关于【Hexo】maupassant 主题设置百度站点自动推送 的博客
这种自动推送的方式也只有在页面受访时才会被提交至百度,只可惜百度对个人博客url的收录速度确实无法跟Google比呀,因此编写Python脚本通过站点的 sitemap.xml 与Linux定时任务实现 主动推送 的自动化。具体步骤如下:
可转至 https://ziyuan.baidu.com/college/courseinfo?id=267&page=2#h2_article_title9 ,百度搜索资源平台查看链接提交方式的效果差异:
对于以上的sitemap与自动推送方式,此前博主已设置过该方式,但链接提交速度还是不如主动推送。
首先,引用百度关于主动推动的相关格式:
推送接口
接口调用地址:http://data.zz.baidu.com/urls?site=个人博客地址&token=每个站长有唯一的标识
参数名称 是否必选 参数类型 说明 site 是 string 在搜索资源平台验证的站点,比如www.example.com token 是 string 在搜索资源平台申请的推送用的准入密钥 推送示例
curl推送示例
将要提交的链接按照每行一条的格式写入一个文本文件中,命名此文件为urls.txt,然后进入该文件所在目录,执行如下命令:
curl -H ‘Content-Type:text/plain’ --data-binary @urls.txt “http://data.zz.baidu.com/urls?site=个人博客地址&token=每个站长有唯一的标识”
这里要求编写一个 urls.txt 文件存放我们想要提交的url。自己手动输入url是件很麻烦的事,因此想到不如从sitemap中提取所有站点url。
来访搭建了个人博客的博主应该都知道怎么生成sitemap,这里还是简要说明一下,以 Hexo 博客框架举例,在博客根目录执行以下代码安装sitemap生成插件:
sudo npm install hexo-generator-sitemap --save
之后编辑Hexo博客根目录下的 _config.yml 文件,添加如下配置:
sitemap:
path: sitemap.xml
安装sitemap生成插件,部署站点后,通过 https://你的博客url/sitemap.xml 即可访问到 sitemap.xml。
现在已生成了sitemap,要做的就是将其中所有的url解析出来写入到某个urls.txt文件中。之后再按照百度的要求执行curl命令即可。
使用到的第三方Python库:Requests
在Linux环境下(CentOS)需要执行以下代码安装:
sudo yum install python3 # 如果没有python则需要先安装
sudo pip3 install requests # 安装 requests 库
blog_url
和token
两个变量,其中token
需要先到百度站长中心添加自己的网站才能获取。import os
import time
import requests
import xml.etree.ElementTree as et
# 务必设定以下两项配置
blog_url = '你的博客地址' # e.g: blog.charjin.top (不添加http或https)
token = '百度搜索资源申请推送的准入密钥' # e.g: QfemDubDm5aArbp1 (在此处查看https://ziyuan.baidu.com/linksubmit)
userdir = os.path.expanduser('~') # 获取用户目录
# 获取sitemap.xml提取url写至本地文件
def parseSitemapToFile(sitemap_url):
r = requests.get(sitemap_url)
r.encoding = 'utf-8'
urlset = et.fromstring(r.text) # sitemap根元素为urlset
file = open(userdir + '/urls.txt', 'w') # 写的形式打开文件, 不存在则自动创建
for url in urlset:
file.write(url[0].text + '\n') # 逐行写入链接
file.close()
parseSitemapToFile('https://%s/sitemap.xml' % blog_url)
# 创建命令
cmd = 'curl -H \'Content-Type:text/plain\' --data-binary @%s/urls.txt \
"http://data.zz.baidu.com/urls?site=%s&token=%s"' % (userdir, blog_url, token)
# 执行命令并获取输出结果
cmt_output = os.popen(cmd).readlines()
# 获取原文件行数便于追加记录, 如果不存在则初始化为0
cnt_line = 0 if os.path.exists(userdir + '/submit_log.txt') == False else len(
open(userdir + '/submit_log.txt', 'r').readlines())
# 获取当前时间用于日志记录
current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 以append形式打开文件
file_log = open(userdir + '/submit_log.txt', 'a')
# 按格式和序号将提交日志写入文件
file_log.write(str(cnt_line + 1) + '. ' + current_time + ' - result: ' + cmt_output[0] + '\n')
# 关闭文件
file_log.close()
既然有个人站点,必定是已购买了个人服务器的,所以应充分发挥服务器的作用,哈哈。
仅以CentOS举例:
scp activepush.py 服务器名:~/
/etc/cron.daily
目录下,实际上通过tab补全可以看到有多个cron的目录。cd /etc/cron.
cron.d/ cron.daily/ cron.hourly/ cron.monthly/ cron.weekly/
这里不同目录下分别存放的是每天、每周、每小时等等执行的脚本文件。因此进入/etc/cron.hourly
目录后,通过vim在其中创建shell脚本文件: vim activepush
,在该文件中输入以下命令,之后 :qw
退出并保存。
python3 存放python代码的目录/activepush.py
sudo chmod a+x activepush
OK,最后,昨天凌晨挂上去的,现在查看一下日志文件
[root@server-char]~# cat urls.txt
https://blog.charjin.top/2020/02/25/PAT-A1131/
https://blog.charjin.top/2020/02/25/PAT-A1127/
https://blog.charjin.top/2020/02/24/pat-A1135/
....一共有55条...这里省略了
[root@server-char]~# cat submit_log.txt
1. 2020-02-26 02:01:04 - result: {"remain":99065,"success":55}
2. 2020-02-26 03:01:01 - result: {"remain":99010,"success":55}
3. 2020-02-26 04:01:05 - result: {"remain":98955,"success":55}
4. 2020-02-26 05:01:05 - result: {"remain":98900,"success":55}
5. 2020-02-26 06:01:06 - result: {"remain":98845,"success":55}
6. 2020-02-26 07:01:05 - result: {"remain":98790,"success":55}
7. 2020-02-26 08:01:03 - result: {"remain":98735,"success":55}
8. 2020-02-26 09:01:04 - result: {"remain":98680,"success":55}
9. 2020-02-26 10:01:05 - result: {"remain":98625,"success":55}
10. 2020-02-26 11:01:04 - result: {"remain":98460,"success":55}
每小时提交一次,一共提交10次了,这里remain是百度说每日剩余可提交的url数量,但是似乎是每天10万条,怎么提交也不会超过。
现在我的站点将主动推送也已自动化,集结了主动推送、自动推送以及sitemap自动抓取,这回还不努力收录我的urls,我真要对百度失望了。
最后,似乎完成对全站的https认证才能提高链接的收录几率。