Python web多sitemap创建更新解决方案
这篇博客主要介绍本人对于Python web(这里使用的是Flask)使用多sitemap(即因为网站存在大量平均增长的页面)的解决思路与方案:
- 两种sitemap自动创建更新解决方案对比
- 方案详解
两种sitemap自动创建更新解决方案对比
方案一: 使用路由视图和模板语言自动生成
一般来说,使用python进行web开发,最简单的sitemap解决方法就是使用模板语言来创建sitemap.xml文件, 也就是的动态创建sitemap,这种方法的基本思路就是:
搜索引擎每次通过url访问该网站的sitemap文件的时候,通过路由从数据库中查询获取数据,然后填充到sitemap模板并返回.
这样做的好处以下几点:
1.除开网站的基本页面(如首页,登录页)以外,其余由由用户创建的网页(如博客,帖子)的sitemap的更新都不用管理员去手动或这调用任何命令去更新,因为搜索引擎每次访问的时候,就会自动返回从数据库中获取的最新的数据
2.简单方便,只需要写一个路由接口(视图)然后给出一个sitemap模板,就可以了.
这种方法虽然最简单方便,但是缺点也显而易见:
- 由于单个sitemap文件中包含的url上限不能超过50000个,所以这种方法只适合用户基数以及网站页面不多的小型网站, 因为小型网站一般只有一个sitemap文件。
所以说这种方法不适用于需要多个sitemap文件的页面较多的网站.
方案二:运用python的xml模块进行sitemap文件的创建与更新
这种方案,也是本人目前这里运用并将要详细介绍的方案。
这种解决方案,基本思路就是写一个集中控制sitemap文件创建和更新的方法,然后可将其作为命令调用,并设置为服务器定时任务对sitemap进行定时更新,或提供后台管理进行调用。
那么很明显,对比上面的方案一,这两种方案的最大区别就在于:
- 除开网站基本页面的更新(如首页,登陆等)需要人为去修改以外,对于其余的平均增长的页面(如帖子,博客等),这种方案需要管理员或linux定时任务来调用更新sitemap的方法,而上面的方案一,则完全依赖于搜索引擎那边何时访问(更新)本网站的sitemap
这种方案虽然比上面的方案一要复杂很多,但是好处在于:
- 适用于用户基数和页面较多的网站,因为这种方法可以管理多个sitemap的创建和更新,这样就解决了单个sitemap中url上限的问题
- 由于是纯粹的靠python的xml模块来进行对sitemap文件的创建和更新,也就纯粹的对文件的读写操作,所以对sitemap文件的可控性更强
比如,一个sitemap文件的内容更新后,需要根据这个sitemap文件更新的内容去更新另一个sitemap文件中的内容。
方案详解
**下面将详细讲解方案二的运用实例,这里我们主要使用的是python xml模块中的etree模块**注意:
首先说明一下这里的应用情景:这里我们有一个发帖的网站,我们要在sitemap文件中录入每一篇帖子,并且有新帖子发布的时候,要更新sitemap中帖子广场页面的url。etree模块对于读取非信任渠道的数据是有安全隐患的,如读取用户和前端传过来的数据,但这里我们用于操作自己网站的sitemap文件,所以这里不计较这个安全性问题。
Sitemap文件列表:
sitemap文件名 | 作用 |
---|---|
sitemap_index.xml | sitemap索引文件,索引多个sitemap文件,向搜索引擎提交的就是这个文件 |
s_posts_(n).xml | 帖子页面的sitemap文件,n表示版本号,下面将详细介绍这个版本号的作用 |
s_base.xml | 基本页面的sitemap文件,如首页,登陆页,帖子广场页面等,此sitemap文件大多数时候是需要人为写入和修改的。 |
每个用途的sitemap文件大体内容结构:
- sitemap_index.xml
<?xml version='1.0' encoding='utf-8'?>
<sitemapindex>
<sitemap>
<loc></loc>
<lastmod></lastmod>
</sitemap>
</sitemapindex>
- s_posts.xml
<?xml version='1.0' encoding='utf-8'?>
<urlset>
<url>
<loc></loc>
<changefreq></changefreq>
<priority></priority>
<lastmod></lastmod>
</url>
</urlset>
- s_base.xml
<?xml version='1.0' encoding='utf-8'?>
<urlset>
<!-- 这里主要是放我们的帖子广场的url -->
<url>
<loc>http://www.xfc.com/posts</loc>
<changefreq></changefreq>
<priority></priority>
<lastmod></lastmod>
</url>
</urlset>
此方案更新sitemap文件的大体流程如下:
接下来进入代码详解的正题:
首先我们创建一个类,一个用于封装sitemap文件的信息和操作的类,这是我们整个方案的核心之一:from xml.etree import ElementTree as ET
import os
from flask import url_for
import ModelPost
from datetime import datetime
SITEMAP_DIR = os.path.join(os.path.abspath(os.path.dirname(__name__)), "xfc/static/sitemaps")
SITEMAP_URL = "http://wwww.xfc.cn/static/sitemaps/"
INDEX_SITEMAP_NAME = "sitemap_index"
POSTS_SITEMAP_NAME = 's_posts'
BASE_SITEMAP_NAME =