如何解析具有压缩链接的站点地图索引

How to parse a sitemap index that has compressed links

我制作了一个程序来读取页面的 /robots.txt 和 /sitemap.xml 并减去可用的站点地图并将它们存储在 siteMapsUnsorted 列表中。 在那里,我使用 crawler-commons 库来分析链接是站点地图还是站点地图索引(站点地图集群)。

当我在正常的 siteMapIndex 上使用它时它可以工作,但在某些情况下会出现问题,因为较大的站点具有压缩格式的 SiteMapIndexes 列表,例如:


我使用的代码:

SiteMapParser sitemapParser = new SiteMapParser();

for (String sitemapURLStr : siteMapsUnsorted) {
    AbstractSiteMap siteMapCandidate = sitemapParser.parseSiteMap(new URL(sitemapURLStr));
//AbstractSiteMap siteMapCandidate = sitemapParser.parseSiteMap("xml", content , new URL(sitemapURLStr));
    
    // Check if the elements inside the list are SiteMapIndexes or SiteMaps, if they are SiteMapINDEXES, we need to break them down into SiteMaps
    if (siteMapCandidate instanceof SiteMapIndex){
        SiteMapIndex siteMapIndex = (SiteMapIndex) siteMapCandidate;

        for (AbstractSiteMap aSiteMap : siteMapIndex.getSitemaps()){
            if (aSiteMap instanceof  SiteMap){
                String siteMapString = aSiteMap.getUrl().toString();
                System.out.println(siteMapString);
                siteMaps.add(siteMapString);
            } else{
                LOG.warn("ignoring site map index inside site map index: " + aSiteMap.getUrl());
            }
        }
    }
    // If the elements inside the list are individual SiteMaps we add them to the SiteMaps list
    else {
        siteMaps.add(siteMapCandidate.getUrl().toString());
    }
}

我注意到方法 parseSitemap 会根据您传递给它的参数而变化,但在多次尝试后我找不到处理压缩元素的方法。

我最后的选择是编写一个方法,下载每个 .tar.gz,解压缩它,读取解压缩的链接列表,存储它们,最后删除目录;但这会 极其缓慢且效率低下 ,所以首先我来这里看看是否有人有更好的 idea/could 帮助我使用 parseSitemap()。

感谢任何提前提供帮助的人。

失败的原因是 Tripadvisor 没有在其站点地图上设置正确的 mime 类型:

$ curl --head https://www.tripadvisor.es/sitemap/2/es/sitemap-1662847-es-articles-1644753222.xml.gz
...
content-type: text/plain; charset=utf-8

和正在使用 only decodes with gzip 的库,当内容类型是以下之一时:

private static String[] GZIP_MIMETYPES = new String[] { 
  "application/gzip",
  "application/gzip-compressed",
  "application/gzipped",
  "application/x-gzip",
  "application/x-gzip-compressed",
  "application/x-gunzip",
  "gzip/document"
};

您可以通过更好地检测 gzip 和 xml(例如 URL 以 .xml.gz 结尾)并在之后直接调用 processGzippedXML 方法来解决此问题将站点地图下载到 byte[].