0%

Hexo博客使用GitHub Actions自动提交百度Sitemap

当我看到我的博客可怜的PV时,我开始学习SEO,这才第一次登陆https://ziyuan.baidu.com/,然后发现我的博客在百度的索引量仅仅只有8个!

怪不得我的blog来源基本都是google和bing,合着百度完全没收录过我的文章~那就只好主动提交咯,但是查了半天,百度也没有google这种主动提交sitemap的接口,只有一个接口来接收url。只好边吐槽百度资源站的原始,边写点东西,让这个博客可以通过github actions来给百度提交sitemap。

准备脚本

先使用python编写一个脚本,可以解析指定的sitemap.xml文件,提取其中的url,然后发送给百度:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/usr/bin/env python3

"""
向百度提交sitemap的脚本

visit: https://knktc.com

@author:knktc
@contact:me@knktc.com
@create:2022-02-12 22:49
"""

import time
import argparse
from urllib import request
from urllib.parse import urljoin
import xml.etree.ElementTree as ET


def chunker(seq, size):
""" iterate list by chunk """
return (seq[pos:pos + size] for pos in range(0, len(seq), size))


class BaiduSubmitter:
def __init__(self, site: str, token: str, sitemap: str):
self.submit_url = self.gen_submit_url(site, token)
self.sitemap_url = self.gen_sitemap_url(site, sitemap)

@staticmethod
def gen_submit_url(site: str, token: str) -> str:
""" generate url to submit to """
return f'http://data.zz.baidu.com/urls?site={site}&token={token}'

@staticmethod
def gen_sitemap_url(site: str, sitemap: str) -> str:
""" generate url path to get sitemap """
return urljoin(site, sitemap)

@staticmethod
def get_links_from_sitemap(sitemap_url) -> list:
""" download sitemap, parse and get urls """
with request.urlopen(sitemap_url) as resp:
data = resp.read()

root = ET.fromstring(data)
return [_.text for
_ in root.findall('./{http://www.sitemaps.org/schemas/sitemap/0.9}url/{http://www.sitemaps.org/schemas/sitemap/0.9}loc')]

@staticmethod
def submit(submit_url: str, links: list):
""" submit to baidu """
data = '\n'.join(links).encode('utf8')
req = request.Request(submit_url, data=data)
return request.urlopen(req).read().decode()

def run(self, chunk_size=20, sleep_time=0.1):
""" submit process """
links = self.get_links_from_sitemap(self.sitemap_url)
print(f'Get {len(links)} links from sitemap: [{self.sitemap_url}]')

for chunk in chunker(links, chunk_size):
resp = self.submit(self.submit_url, chunk)
print(resp)
if sleep_time:
time.sleep(sleep_time)

time.sleep(1)


def get_args():
""" get cli args """
parser = argparse.ArgumentParser(description='Submit sitemap to Baidu')
parser.add_argument('--site', '-s', type=str, dest='site', required=True,
help='your site, eg: https://knktc.com')
parser.add_argument('--token', '-t', type=str, dest='token', required=True,
help='baidu ziyuan token, you may find your token in https://ziyuan.baidu.com/linksubmit')
parser.add_argument('--sitemap', '-p', type=str, dest='sitemap', default='sitemap.xml',
help='url path to get sitemap.xml file, default: sitemap.xml')
parser.add_argument('--chunk', '-c', type=int, dest='chunk_size', default=100,
help='how many urls should be submitted each time')

args = parser.parse_args()

return args


def main():
"""
main process

"""
args = get_args()
site = args.site
token = args.token
sitemap_path = args.sitemap
chunk_size = args.chunk_size

submitter = BaiduSubmitter(site, token, sitemap_path)
submitter.run(chunk_size=chunk_size)


if __name__ == '__main__':
main()

这个脚本编写的时候都使用了标准库的东西,不需要再安装额外的依赖了。

可以把这个脚本保存到本地,使用的时候,先在百度搜索资源平台获取到资源提交用的token(就是这个地方https://ziyuan.baidu.com/linksubmit),然后按照以下形式来进行请求就可以了:

1
python3 baidu_submit.py --site https://knktc.com --token AABBCCDD --sitemap sitemap.xml --chunk 100

对命令中的几个参数简单说明下:

  • –site(或是-s):这个用来指定blog的网址;
  • –token(或是-t): 用来指定刚才获取到的token;
  • –sitemap(或是-p): 可以指定下sitemap的路径,比如我的sitemap在https://knktc.com/sitemap.xml,那这里就可以写sitemap.xml就可以了;
  • –chunk(或是-c): 这个地方用来指定给百度发送请求时每批传多少个url过去,默认是100个。

运行的结果类似下面的样子:

1
2
3
4
Get 235 links from sitemap: [https://knktc.com/sitemap.xml]
{"remain":2585,"success":100}
{"remain":2485,"success":100}
{"remain":2450,"success":35}

为了方便分享和维护,我也把这个脚本放到了github gist上,地址是: https://gist.github.com/knktc/846950067e60a92612c1befbe4213a32

后面在github上写workflow的时候直接拉取这个脚本就可以了。

Github Actions

在hexo中添加github actions的配置文件有点小技巧,请先参考我之前写的一篇blog:Hexo博客使用GitHub Actions来自动提交Sitemap

这次可以添加一个baidu_sitemap.yml的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# workflow to summit urls from sitemap to baidu

name: Submit baidu Sitemap

on:
schedule:
- cron: '15 2 * * *'

jobs:
submit:
runs-on: ubuntu-latest

steps:
- name: get gist
uses: andymckay/get-gist-action@0.1
with:
gistURL: https://gist.github.com/knktc/846950067e60a92612c1befbe4213a32

- name: run script
env:
BAIDU_TOKEN: ${{ secrets.BAIDU_TOKEN }}
run: python3 /tmp/baidu_submit.py --site https://knktc.com --token $BAIDU_TOKEN

在这个任务配置中有几个点:

  • 我们指定了UTC时间每天的2:15(也就是北京时间的10:15)运行任务;
  • 运行的脚本是直接从gist上拉取的,没有放到hexo的项目中;
  • 运行脚本时用的百度token需要先在项目的settings中配置下secrets,参考下面的图片设置即可:

bMgFKK.png

然后就可以使用github workflow每天自动给百度提交url了。

如果我的文字帮到了您,那么可不可以请我喝罐可乐?