之前写过一篇关于【Hexo】maupassant 主题设置百度站点自动推送 的博客
这种自动推送的方式也只有在页面受访时才会被提交至百度,只可惜百度对个人博客url的收录速度确实无法跟Google比呀,因此编写Python脚本通过站点的 sitemap.xml 与Linux定时任务实现 主动推送 的自动化。具体步骤如下:
链接提交方式的对比
可转至 https://ziyuan.baidu.com/college/courseinfo?id=267&page=2#h2_article_title9 ,百度搜索资源平台查看链接提交方式的效果差异:
- 主动推送:最为 快速 的提交方式,建议您将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录。
- sitemap: 您可以定期将网站链接放到Sitemap中,然后将Sitemap提交给百度。百度会周期性的抓取检查您提交的Sitemap,对其中的链接进行处理,但收录速度慢于主动推送。
- 手工提交:如果您不想通过程序提交,那么可以采用此种方式,手动将链接提交给百度。
- 自动推送:是轻量级链接提交组件,将自动推送的JS代码放置在站点每一个页面源代码中,当页面被访问时,页面链接会自动推送给百度,有利于新页面更快被百度发现。
对于以上的sitemap与自动推送方式,此前博主已设置过该方式,但链接提交速度还是不如主动推送。
个人博客生成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。
通过Python提取urls并写入文件
现在已生成了sitemap,要做的就是将其中所有的url解析出来写入到某个urls.txt文件中。之后再按照百度的要求执行curl命令即可。
使用到的第三方Python库:Requests
在Linux环境下(CentOS)需要执行以下代码安装:
sudo yum install python3 # 如果没有python则需要先安装
sudo pip3 install requests # 安装 requests 库
- 代码相关说明: 务必在执行前,修改以下代码中的
blog_url
和token
两个变量,其中token
需要先到百度站长中心添加自己的网站才能获取。 - 代码基本思路:
- 通过 requests 库将个人站点sitemap中的urls解析出来并到用户目录下的 urls.txt 文件中
- 通过 os 库执行命令,将命令执行后的输出按行写入到用户目录下的 submit_log.txt 文件中,以保存作为链接的提交日志。同时记录提交的次数和时间。
import os
import os.path as op
import time
import xml.etree.ElementTree as et
import requests
def parse_sitemap(sitemap_url):
r"""
Parse sitemap.xml to urls
"""
r = requests.get(sitemap_url)
r.encoding = 'utf-8'
return [url[0].text for url in et.fromstring(r.text)]
def submit_sitemap(sitemap_url, site, token, save_path=None):
r"""
Submit sitemap.xml to Baidu
The format of submit_url is: `curl -H 'Content-Type:text/plain' --data-binary @urls.txt "http://data.zz.baidu.com/urls?site={}&token={}"`,
where `site` is the domain name of the personal site, and `token` is the access token for baidu.
The command of submit_url can be found in the following link: `https://ziyuan.baidu.com/linksubmit/index`
Args:
sitemap_url: The `sitemap.xml` url
site: Site name
token: Baidu Ziyuan token
save_path: Path to save the submitting log
"""
urls = parse_sitemap(sitemap_url)
if save_path is None:
save_path = op.join(op.expanduser('~'), 'var', 'sitemap')
os.makedirs(save_path, exist_ok=True)
url_path = op.join(save_path, 'urls.txt')
log_path = op.join(save_path, 'baidu_site.log')
with open(url_path, 'w') as f:
f.write('\n'.join(urls) + '\n')
cmd = f'curl -H \'Content-Type:text/plain\' --data-binary @{url_path} "http://data.zz.baidu.com/urls?site={site}&token={token}"'
response = os.popen(cmd).readlines()
if os.path.exists(log_path):
with open(log_path, 'r') as f:
line_num = len(f.readlines())
else:
line_num = 0
current_time = time.strftime(r"%Y-%m-%d %H:%M:%S", time.localtime())
with open(log_path, 'a+') as f:
f.write(f"{line_num + 1}. {current_time} - result: {response[0]}\n")
if __name__ == '__main__':
submit_sitemap(sitemap_url='https://{your_site}/sitemap.xml',
site='https://{your_site}', token='{token from baidu}', save_path=None)
通过Linux服务器执行定时任务
既然有个人站点,必定是已购买了个人服务器的,所以应充分发挥服务器的作用,哈哈。
仅以CentOS举例:
- 将在本地写好的python代码(此处文件名为 activepush.py )复制到服务器的用户目录之下:(也可在服务器中直接编辑创建)
scp activepush.py 服务器名:~/
- 假设是以 root 用户登录的,现在cd至
/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
- 最后要让创建的shell脚本可执行,通过chmod修改权限(为了方便设为对所有用户都可执行)
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认证才能提高链接的收录几率。