如何解析具有压缩链接的站点地图索引
How to parse a sitemap index that has compressed links
我制作了一个程序来读取页面的 /robots.txt 和 /sitemap.xml 并减去可用的站点地图并将它们存储在 siteMapsUnsorted
列表中。
在那里,我使用 crawler-commons 库来分析链接是站点地图还是站点地图索引(站点地图集群)。
当我在正常的 siteMapIndex 上使用它时它可以工作,但在某些情况下会出现问题,因为较大的站点具有压缩格式的 SiteMapIndexes 列表,例如:
- 压缩站点地图索引: http://tripadvisor-sitemaps.s3-website-us-east-1.amazonaws.com/2/es/sitemap_es_index.xml
- 正常站点地图索引: https://www.infolibre.es/sitemap_index_382e2.xml
我使用的代码:
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[]
.
我制作了一个程序来读取页面的 /robots.txt 和 /sitemap.xml 并减去可用的站点地图并将它们存储在 siteMapsUnsorted
列表中。
在那里,我使用 crawler-commons 库来分析链接是站点地图还是站点地图索引(站点地图集群)。
当我在正常的 siteMapIndex 上使用它时它可以工作,但在某些情况下会出现问题,因为较大的站点具有压缩格式的 SiteMapIndexes 列表,例如:
- 压缩站点地图索引: http://tripadvisor-sitemaps.s3-website-us-east-1.amazonaws.com/2/es/sitemap_es_index.xml
- 正常站点地图索引: https://www.infolibre.es/sitemap_index_382e2.xml
我使用的代码:
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[]
.