在 StormCrawler 中处理重定向域
dealing with redirect domains in StormCrawler
我正在从事基于 StormCrawler 的项目。我们的要求之一是找到重定向到另一个域的域。在 StormCrawler 中,每个重定向 URL 都被视为爬虫的深度。例如,对于有两个重定向步骤的域,我们需要使用深度=2 进行爬取。如何在不考虑爬虫中的 depth 的情况下解析所有重定向域?
过滤器不区分从重定向中找到的 URL 和来自页面中的链接的 URL。您可以简单地停用基于深度的过滤器,并在必要时使用自定义解析过滤器来限制外链。
我修改了MaxDepthFilter如下:
public class MaxDepthFilter implements URLFilter {
private static final Logger LOG = LoggerFactory
.getLogger(MaxDepthFilter.class);
private int maxDepth;
@Override
public void configure(Map stormConf, JsonNode paramNode) {
JsonNode node = paramNode.get("maxDepth");
if (node != null && node.isInt()) {
maxDepth = node.intValue();
} else {
maxDepth = -1;
LOG.warn("maxDepth parameter not found");
}
}
@Override
public String filter(URL pageUrl, Metadata sourceMetadata, String url) {
int depth = getDepth(sourceMetadata, MetadataTransfer.depthKeyName);
boolean containsRedir = containsRedirect(sourceMetadata, "_redirTo");
// is there a custom value set for this particular URL?
int customMax = getDepth(sourceMetadata,
MetadataTransfer.maxDepthKeyName);
if (customMax >= 0) {
return filter(depth, customMax, url);
}
// rely on the default max otherwise
else if (maxDepth >= 0) {
if(containsRedir)
return url;
else
return filter(depth, maxDepth, url);
}
return url;
}
private String filter(int depth, int max, String url) {
// deactivate the outlink no matter what the depth is
if (max == 0) {
return null;
}
if (depth >= max) {
return null;
}
return url;
}
private int getDepth(Metadata sourceMetadata, String key) {
if (sourceMetadata == null) {
return -1;
}
String depth = sourceMetadata.getFirstValue(key);
if (StringUtils.isNumeric(depth)) {
return Integer.parseInt(depth);
} else {
return -1;
}
}
private boolean containsRedirect(Metadata sourceMetadata, String key) {
if (sourceMetadata == null) {
return false;
}
String redir = sourceMetadata.getFirstValue(key);
if (StringUtils.isNotBlank(redir)) {
return true;
} else {
return false;
}
}
}
它是否正常工作或陷入无限循环?
我正在从事基于 StormCrawler 的项目。我们的要求之一是找到重定向到另一个域的域。在 StormCrawler 中,每个重定向 URL 都被视为爬虫的深度。例如,对于有两个重定向步骤的域,我们需要使用深度=2 进行爬取。如何在不考虑爬虫中的 depth 的情况下解析所有重定向域?
过滤器不区分从重定向中找到的 URL 和来自页面中的链接的 URL。您可以简单地停用基于深度的过滤器,并在必要时使用自定义解析过滤器来限制外链。
我修改了MaxDepthFilter如下:
public class MaxDepthFilter implements URLFilter {
private static final Logger LOG = LoggerFactory
.getLogger(MaxDepthFilter.class);
private int maxDepth;
@Override
public void configure(Map stormConf, JsonNode paramNode) {
JsonNode node = paramNode.get("maxDepth");
if (node != null && node.isInt()) {
maxDepth = node.intValue();
} else {
maxDepth = -1;
LOG.warn("maxDepth parameter not found");
}
}
@Override
public String filter(URL pageUrl, Metadata sourceMetadata, String url) {
int depth = getDepth(sourceMetadata, MetadataTransfer.depthKeyName);
boolean containsRedir = containsRedirect(sourceMetadata, "_redirTo");
// is there a custom value set for this particular URL?
int customMax = getDepth(sourceMetadata,
MetadataTransfer.maxDepthKeyName);
if (customMax >= 0) {
return filter(depth, customMax, url);
}
// rely on the default max otherwise
else if (maxDepth >= 0) {
if(containsRedir)
return url;
else
return filter(depth, maxDepth, url);
}
return url;
}
private String filter(int depth, int max, String url) {
// deactivate the outlink no matter what the depth is
if (max == 0) {
return null;
}
if (depth >= max) {
return null;
}
return url;
}
private int getDepth(Metadata sourceMetadata, String key) {
if (sourceMetadata == null) {
return -1;
}
String depth = sourceMetadata.getFirstValue(key);
if (StringUtils.isNumeric(depth)) {
return Integer.parseInt(depth);
} else {
return -1;
}
}
private boolean containsRedirect(Metadata sourceMetadata, String key) {
if (sourceMetadata == null) {
return false;
}
String redir = sourceMetadata.getFirstValue(key);
if (StringUtils.isNotBlank(redir)) {
return true;
} else {
return false;
}
}
}
它是否正常工作或陷入无限循环?