hugo博客百度必应提交url
背景
建站之后,为了文章能够被搜索引擎收录,我们需要将站点提交到Google、百度、Bing等搜索网站,通过验证之后,搜索引擎才会去我们的网站爬数据。
为了方便爬虫爬取我们站点里的文章,我们可以将站点地图(sitemap.xml)提交到搜索网站。提交之后,爬虫在光临我们的网站时,会根据sitemap.xml的指引,抓取所有的URL。
但是,爬虫光临我们站点的周期太长(谷歌会比较快一点,其他搜索引擎就比较慢了),如果想发布文章之后尽快被搜索引擎收录,我们可以主动提交URL到搜索网站。Google只能在网页上操作,百度和Bing都提供了API。这种API在对应成熟的动态建站框架生态中都用对应的插件,比如worldpress等。但hugo是静态博客,往往是部署在github等静态托管服务上,没有插件可用。下面介绍在hugo博客中如何使用API提交URL。
提取文章url
提取文章的url思路又很多中,比如去解析sitemap.xml, 或者部署github仓库的时候有单独的分支会生成html文件,通过git commit检测生成的html即可。或者再笨一点的办法,直接在仓库中新增一个url.txt文件,每次新增文章的时候手动在url.txt中添加新文章的url。以上方法都可以实现文章url的获取,但是都不够优雅,也不够通用。我直接从hugo的原理出发,既然hugo本身的url生成是在文章开头的配置区域里面参数生成的,为何我不直接从新文章里面的文章描述获取
---
title: test
author: mango
date: '2024-01-01'
slug: YeelightWifiRaspberryPiController
categories:
- test
tags:
- xxx
- xxx
- xxx
---
比如直接获取里面的YeelightWifiRaspberryPiController字符串,和域名网址再拼起来就可以了。这个方案适用于部署在任何地方的hugo博客,包括githubpages和cloudflare,我hugo博客部署在cloudflare。
- 获取最近一次提交的commit
git rev-parse --short HEAD
4ae25be
在脚本中实现可以使用subprocess模块,执行一个命令如
ret = subprocess.run(
"git rev-parse --short HEAD", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True
)
调用此模块允许git命令行可以执行,并且执行的输出结果会保存到ret中,后续步骤使用
- 基于该commit查询本次变更的文件
git show --pretty="" --name-only 4ae25be
post/test1.md
在脚本中,依然采用subprocess模块。先从上一个步骤中获取commit id,再拼装组成完整命令
commit_id = str(ret.stdout, "utf_8").strip()
ret = subprocess.run(
"git show --pretty=" " --name-only " + commit_id,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True
)
同样的,输出结果也保存在返回结果里面了,可以处理一下取出来
changes = str(ret.stdout, "utf-8").split("\n")
- 再通过文件扩展名筛选出markdown格式的文章文件,这个通过python脚本很容易实现。
if filename.endswith(".md"):
#....
- 打开markdown博文,检索
---
title: test
author: mango
date: '2024-01-01'
slug: YeelightWifiRaspberryPiController
categories:
- test
tags:
- xxx
- xxx
- xxx
---
中开头slug的url链接,然后再和域名网址拼起来,就可以获取到最新一次提交的文章url了。
def get_slug(post_path):
post = open(post_path)
lines = post.readlines()
for line in lines:
if 'slug:' in line:
return line.split(':', 1)[1].strip()
基于api推送给搜索引擎
获取到文章的url后,下一步就是需要将url通过搜索引擎给的api给提交上去了。在此之前,需要完成百度站长和必应站长工具的注册,百度站长注册完成后可以直接获取api了,但必应仍然需要单独申请indexnow的推送key,indexnow申请地址https://www.bing.com/webmasters/indexnow
百度
注册完百度站长,添加完网站后。在资源提交-普通收录-API提交-推送示例可以找到推送的示例,百度提供了多种的提交示例,我们这里选择的是post推送
POST /urls?site=https://youdomain.com&token=xxxxxxxx/1.1
User-Agent: curl/7.12.1
Host: data.zz.baidu.com
Content-Type: text/plain
Content-Length: 83
http://www.example.com/1.html
http://www.example.com/2.html
所以需要将获取到的url和自己api拼成,以上的请求格式。
# 提交到百度
headers = {
"User-Agent": "curl/7.12.1",
"Host": "data.zz.baidu.com",
"Content-Type": "text/plain"
}
response = requests.post(
url=baidu_api,
headers=headers,
data="\n".join(urls)
)
必应
同样的,必应也需要相应的请求接口,必应分别提供了json和xml两种接口,这里选择使用json接口。而且必应还提供webapi和indexnow两种推送,对于个人博客站点来说两种差别都不大。我这里脚本实现采用的是webapi的方式,indexnow留着下篇再介绍,有不需要写脚本的方式。
JSON request sample:
POST /webmaster/api.svc/json/SubmitUrlbatch?apikey=sampleapikeyEDECC1EA4AE341CC8B6 HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: ssl.bing.com
{
"siteUrl":"http://yoursite.com",
"urlList":[
"http://yoursite.com/url1",
"http://yoursite.com/url2",
"http://yoursite.com/url3"
]
}
#正常的返回内容
JSON response sample:
HTTP/1.1 200 OK
Content-Length: 10
Content-Type: application/json; charset=utf-8
{
"d":null
}
依照以上格式要求,也把请求配置出来
# 提交到bing
headers = {
"Content-Type": "application/json; charset=utf-8",
"Host": "ssl.bing.com",
}
data = {"siteUrl": website_url, "urlList": urls}
response = requests.post(
url=bing_api,
headers=headers,
data=json.dumps(data)
)
其中webapi的key申请路径为
测试
直接运行后,发现百度的响应返回提示超出限制了。
//超出提交数量
{"error":400,"message":"over quota"}
可以去在线工具,测试一下,自己剩余的提交数量。
https://tendcode.com/tool/baidu-linksubmit/
我目前的提交限制在每天10条,在正常数量限制下,再次测试运行。响应结果是OK的
url:['https://blog.mangoeffect.net/filter/a-brief-discussion-on-beauty-microdermabrasion-algorithm']
bing的响应: b'{"d":null}'
百度的响应: b'{"remain":7,"success":1}'
优化
以上脚本可以在本地写完博文后,推送完博文后。本地运行一下脚本即可,但是仍然需要多本地执行脚本这么一个步骤,所以其实还不够优雅。理论上最优雅的方式就是你无需感知到需要提交url这么一个步骤,只需要写博文就可以。所以这个方案还可以继续优化,那就是让脚本自动化执行。可以利用github action的自动化执行,新建一个ci任务,然后设置push后就触发脚本执行,至此一切都完美。
完整脚本获取&&使用
关注本公众号,回复"hugo博客seo"获取脚本下载链接。下载后,打开脚本输入自己的配置
# 网址域名,注意以/结尾,换成你的博客域名
website_url="https://blog.mangoeffect.net/"
# 百度推送api,换成你的域名和token
baidu_api="http://data.zz.baidu.com/urls?site=https://blog.mangoeffect.net&token=xxxxxxxxxx"
# 必应web推送api,换成入你的apikey
bing_api="https://www.bing.com/webmaster/api.svc/json/SubmitUrlbatch?apikey=xxxxxxxxx"
放到hugo博客仓库根目录即可,每次发布完新文章后执行脚本。