python - 动态网站的站点地图生成解决方案

标签 python google-app-engine google-cloud-datastore sitemap google-cloud-storage

上下文
假设我的网站包含跨国家、州、城市和地区组织的商店列表。每个商店都有一个动态生成的网页。商店总数最终将达到约150万家。我使用 NDB 来存储商店数据。我计划使用 XML 站点地图并将其手动提交到搜索引擎。我使用 GAE Python。

问题
我想在所有商店页面的站点地图中维护(生成并保持更新)网址链接。 商店页面的每个唯一 URL 链接都包含以下内容: 国家、州、城市、地区、商店名称、唯一索引

例如,wwww.example.com/country--state--city--locality--shop_name--unique_index

可以添加、删除商店或其数据(例如,名称或城市等)。 我需要设计一个解决方案,帮助我获得最新的站点地图以及所有商店的更新链接。我打算在添加/删除/更新任何商店后尽快提交新的站点地图。

我的方法
方法1
通过查询 NDB 模型中的信息来动态生成站点地图。
方法 1 的缺点

  1. NDB 提取限制为 10,000。
  2. 读取操作免费额度为50,000。
  3. 前端实例时间消耗较高。
  4. 操作完成时间为 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 文件将包含:

  • 基于国家/地区的其他站点地图索引文件的 URL 条目。 这些国家/地区站点地图文件将包含国家/地区 URL 的条目 站点地图文件。同样,状态站点地图文件将包含条目 用于城市站点地图文件的 URL。同样,城市站点地图文件将 包含地点站点地图文件的 URL 条目。地区站点地图 文件将包含商店页面 URL 的条目。

  • 包含所有静态页面 URL 的条目(例如常见问题解答、关于我们等)。

方法 3 的优点

  • 当添加/删除/更新商店页面时,我需要更新 该特定站点地图文件。

对方法3的怀疑

  • 我可以将所有 sitemap.xml 文件存储在 GCS 中吗?你预见到任何 有问题吗?

  • 是否允许有多个级别的站点地图索引文件指向 到其他站点地图索引文件?

我找不到好的解决方案。我在 SO 和 Nick 的博客上看到过类似的问题,但徒劳无功。 如果可能的话,我希望保持在免费配额之内。 请提供您的建议。

最佳答案

我过去使用过以下解决方案:

  • 当需要对 URL 进行索引时,将具有所需 URL 的任务放入队列中。
  • 处理任务后,将站点地图条目实体与网址(以及您需要的任何其他元数据)一起保存在数据存储区中
  • cron 作业将通过迭代站点地图实体来触发站点地图文件的生成,批量处理大约 50K 条目(调整以获得最佳结果)。它们存储为文件(blobstore、GCS 由您决定),可以直接提供服务并由站点地图文件数据存储实体引用。
  • 您可以根据请求或使用 cron 作业生成站点地图索引,其中包括每个站点地图文件实体。

此解决方案基于一些注意事项:

  • Google 仅偶尔检查您的站点地图。如果您受到谷歌、必应、爬虫等的攻击,您可能需要存储站点地图索引或缓存它。
  • 对站点地图的更改不需要是事务性/当前的,因为它不以这种方式使用。例如,404、301、302 等网址可以存在一段时间,重复的网址也是如此。
  • 您可以找出一种机制来删除或过期旧的站点地图文件实体。您可以使用 TTL,或者只是永不过期,直到每隔几个月运行一次完整的重建(这非常实用)。

有几个积极的方面

  • 您可以对任务进行排队以删除网址(即删除数据存储条目)
  • 您可以创建一个管理端点来清除所有内容并根据数据存储状态重新生成。当使用网站管理员工具进行测试或更改网址生成策略等时,这非常有用。
  • 您可以创建管理页面/端点来手动将文件添加到站点地图(或直接推送到队列)
  • 您可以捆绑在最后一步中不是动态的网址,例如隐私政策、着陆页等

如上所述,there are limitations on sitemap files这意味着您需要分解为许多站点地图文件和站点地图索引。这些限制大约是每个文件最多 50K 条目和每个文件 10mb。考虑到您可能会处理大量数据存储条目,我会优化生成文件(即处理时间和最佳批处理/ block 大小),而不是担心将每个索引文件填充到其限制。

关于python - 动态网站的站点地图生成解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24617100/

相关文章:

python - 使用 numpy.random.multivariate_normal(mean, cov[, size]) 绘制多个样本

java - 如何使用 GoogleAppEngine 创建表

python - 在 Google 应用引擎上同时使用 memcached 和 taskqueue

google-app-engine - Google Datastore,获取特定的实体属性

python 2代码: if python 3 then sys.退出()

python - Python汉字编码错误

java - 实现一对多双向关系 App Engine 时出现 com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException

google-app-engine - Objectify 不会同步存储,即使是现在

python - 无法循环两个位置之间的距离。类型错误 : 'numpy.float64' object is not iterable

python - 如何循环直方图来获取图片的颜色?