Python实现博客站点url实时推送至百度与Linux定时任务

之前写过一篇关于【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_urltoken两个变量,其中token需要先到百度站长中心添加自己的网站才能获取。
  • 代码基本思路:
  1. 通过 requests 库将个人站点sitemap中的urls解析出来并到用户目录下的 urls.txt 文件中
  2. 通过 os 库执行命令,将命令执行后的输出按行写入到用户目录下的 submit_log.txt 文件中,以保存作为链接的提交日志。同时记录提交的次数和时间。
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()

通过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认证才能提高链接的收录几率。

你可能感兴趣的:(技术,Linux)