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=每个站长有唯一的标识

参数名称是否必选参数类型说明
sitestring在搜索资源平台验证的站点,比如www.example.com
tokenstring在搜索资源平台申请的推送用的准入密钥

推送示例

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值