语境
假设我的网站上列出了遍布国家,州,城市和地区的商店清单。每个商店都有一个动态生成的网页。商店总数最终将达到约150万。我使用NDB存储商店数据。我计划使用XML网站地图,并将其手动提交给搜索引擎。我使用GAE Python。
问题
我想在所有商店页面的站点地图中维护(生成并保持更新)URL链接。
商店页面的每个唯一URL链接都包含以下内容:
国家,州,城市,地区,商店名称,唯一索引
例如,wwww.example.com / country--州-城市-地区-商店名称-唯一索引
可以添加,删除商店,也可以更改其数据(例如,名称或城市等)。
我需要设计一个解决方案,以帮助我获得具有所有商店更新链接的最新站点地图。我打算在添加/删除/更新任何商店后尽快提交新的站点地图。
我的方法
方法1
通过查询NDB模型中的信息,即时生成站点地图。
方法1的缺点
NDB的提取限制为10,000。
读取50,000美元的免费操作配额。
大量的前端实例时间。
操作完成时间为60秒。
方法2
使用程序(例如X,由我用Perl / Python编写)在我的笔记本电脑上生成并存储站点地图。每当在我的网站上添加/删除/更新商店时,我都会使用以下助记符来更新GCS(Google云存储)存储的文件:
ADD < shop data like name, etc >
DELETE < shop data like name, etc >
UPDATE < shop data like name, etc >
我将下载此文件并将其输入到本地程序X中,以通过更新较旧的存储站点地图文件来生成站点地图。
方法2的缺点
GCS不允许将数据追加到文件中。每次都需要写入整个文件。因此,随着商店数量从0增加到150万,RAM使用率和前端实例工作时间将达到峰值。
操作完成时间为60秒。
方法3
sitemap.xml文件将包含:
基于国家/地区的其他Sitemap索引文件的URL条目。
这些国家/地区站点地图文件将包含国家/地区网址的条目
站点地图文件。同样,州站点地图文件将包含条目
用于城市站点地图文件的网址。同样,城市站点地图文件将
包含本地站点地图文件URL的条目。地区地图
文件将包含商店页面URL的条目。
所有静态页面(如FAQ,关于我们等)的URL条目。
方法3的优点
当商店页面被添加/删除/更新时,我需要更新
该特定的站点地图文件。
对方法3的怀疑
我可以将所有sitemap.xml文件存储在GCS中吗?你有预见到任何
有什么问题吗?
是否允许指向多个级别的站点地图索引文件
到其他站点地图索引文件?
我找不到一个好的解决方案。我在SO和Nick的博客上看到了类似的问题,但徒劳无功。
我希望尽可能保持免费配额内。
请提供您的建议。
最佳答案
我过去曾使用以下解决方案:
当需要为URL编制索引时,将具有所需URL的任务排队。
处理任务后,将站点地图条目实体与网址(以及所需的其他任何元数据)一起保存在数据存储区中
cron作业将通过迭代站点地图实体触发批处理,生成站点地图文件,批处理到大约50K条目(调整以获得最佳结果)。它们存储为文件(blobstore,由您决定是否使用GCS),可以直接提供服务,并由站点地图文件数据存储实体引用。
根据要求,或使用cron作业,您都可以生成站点地图索引,其中包括每个站点地图文件实体。
此解决方案基于以下警告:
Google仅偶尔检查您的站点地图。如果您受到Google,Bing,Crawler等的打击,则可能要存储站点地图索引或对其进行缓存。
对站点地图的更改不需要是事务性的/当前的,因为它不是以这种方式使用的。例如404、301、302等网址可以保留一段时间,重复的网址也可以。
您可以找出有关如何删除或过期旧站点地图文件实体的机制。您可以使用TTL,或者仅在每隔几个月进行一次完全重建运行之前就不要使它们失效(这非常实用)。
有几个好处
您可以将任务排队以删除网址(即删除数据存储条目)
您可以创建一个管理端点来清除所有内容并根据数据存储状态重新生成。当使用网站管理员工具进行测试或您更改网址生成策略等时,这可能非常有用。
您可以创建一个管理页面/端点来手动将文件添加到站点地图(或仅推送到队列)
您可以捆绑在最后一步中不是动态的网址,例如隐私政策,登录页面等
如前所述,there are limitations on sitemap files表示您将要分解为许多站点地图文件和一个站点地图索引。这些限制大约是每个文件最多50K条目,每个文件最多10mb。鉴于您可能要处理大量数据存储条目,因此我会优化生成文件的时间(即处理时间和最佳批处理/块大小),而不必担心将每个索引文件填满到其限制。
关于python - 动态网站的Sitemap生成解决方案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24617100/