用Python 3 实现SEO Sitemap批量生成的方法源代码

作者杰西

11月 4, 2022

最近学了点Python基础,写了段用Python实现SEO Sitemap批量生成的代码,可对指定的存放URL的文件生成对应格式的sitemap文件,并对子sitemap生成对应的sitemap索引文件,分享给大家,遇到大量URL需要生成sitemap文件时可以自己动手搞起来,测试了下生成50W个URL的sitemap文件大概需要2-3秒,应该足够用了。

代码有参考 github上的 jingchaofang

https://github.com/jingchaofang/python-sitemap/blob/master/sitemap.py

对其中一些小问题进行了修复,且按照自己的理解对其中一些代码块进行了优化甚至重写,子sitemap的生成逻辑也根据自己的理解逻辑进行了调整,加了一些方便理解的注释,下方是具体的代码供参考:

# 此代码可基于一个存放纯URL的文件(每行存放一条)生成其对应的sitemap子文件和索引文件
# 单个sitemap子文件中最多存放5W条URL(应搜索引擎对sitemap文件的要求)
# 搜索引擎要求:单个sitemap文件存放最多5W条URL,且文件大小不超过50M
# author:杰西SEO(jessie seo)微信公众号:杰西SEO

# <代码部分开始> ------------------------------------------------------
# 引入os库和datetime库用于文件操作和日期时间的调用
import os, datetime

# 手动设置网站的域名,或者存放sitemap文件的路径
host = '/'
# 新建一个存放sitemap的文件夹,默认叫seo_sitemap,可自行修改。
folder = os.popen('mkdir seo_sitemap')
# 给定sitemap.xml文件存放的路径
path = 'seo_sitemap/'
# 获取sitemap生成时的当日日期
lastmod = datetime.date.today()

# 计算总的URL条数
c = 0
for i in open('存放URL文件的地址或路径'):
    url = i.strip()
    if len(url) == 0:
        pass
    else:
        c += 1

# 计算可生成的子sitemap个数
file_num = c % 50000

if file_num == 0:
    file_num = int(c / 50000)
    print(f'共有{c}条URL, 生成{file_num}个sitemap个文件')
else:
    file_num = int(c / 50000) + 1
    print(f'共有{c}条URL, 生成{file_num}个sitemap个文件')

# 生成sitemap index文件

f_index = open(f'{path}/sitemap_index.xml', 'w')
f_index.write('<?xml version="1.0" encoding="utf-8"?>\n')
f_index.write('<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n')
for d in range(file_num):
    d += 1
    f_index.write(f"  <sitemap>\n    <loc>{host}{path}sitemap_{d}.xml</loc>\n    <lastmod>{lastmod}</lastmod>\n  </sitemap>\n")
f_index.write('</sitemapindex>')
f_index.close()

# 创建每个sitemap子文件的引用头
def add_file(e):
    file_name = f'sitemap_{e}.xml'
    f = open(f"{path}{file_name}", "w+")
    f.write('<?xml version="1.0" encoding="utf-8"?>\n')
    f.write('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n')
    return f

# 按照每5W条URL生成一个sitemap,并自动命名为sitemap_{num}.xml
i = 0
# 用于循环写入头文件
for e in range(file_num):
    e += 1
    f = add_file(e)
# 用于取出URL文本中的单个URL
    for url in open("存放URL文件的地址或路径"):
        url = url.strip()
        i += 1
        c -= 1
# 控制单个sitemap文件生成时的结束代码 - 代码1
        if i == 50000:
            f.write(f"  <url>\n    <loc>{url}</loc>\n    <lastmod>{lastmod}</lastmod>\n    <changefreq>daily</changefreq>\n  </url>\n")
            f.write('</urlset>')
            f.close()
            i = 0
            break
# URL列表未读取完成时,继续向子sitemap文件中写入<url>中相关代码
            if c > 0:
                continue
        f.write(f"  <url>\n    <loc>{url}</loc>\n    <lastmod>{lastmod}</lastmod>\n    <changefreq>daily</changefreq>\n  </url>\n")
# URL列表已经全部读取完,返回此段代码,i != 50000是为了避免与单个5W子sitemap生成时间恰好是整个URL文件读完时间避免与代码1冲突。
        if c == 0 and i != 50000:
            f.write('</urlset>')
            f.close()
            break

# <代码部分结束> ------------------------------------------------------

python刚学几天,代码比较基础,仅供参考,如有更高级简易的实现方法,欢迎交流指教。
更多seo技巧和资讯欢迎关注我的微信公众号:杰西SEO

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注