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。

  1. 获取最近一次提交的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中,后续步骤使用

  1. 基于该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")
  1. 再通过文件扩展名筛选出markdown格式的文章文件,这个通过python脚本很容易实现。
if filename.endswith(".md"):
    #....
  1. 打开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申请路径为

bing_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博客仓库根目录即可,每次发布完新文章后执行脚本。


微信公众号


 继续浏览关于 seohugo百度bing 的文章

 本文最后更新于 2024/02/23 22:41:50,可能因经年累月而与现状有所差异

 引用转载请注明: 芒果屋 > 默认分类 > hugo博客百度必应提交url

您直接访问了本站,莫非记住了域名?