Apache Nutch默认配置爬取域名不均等问题及配置优化咨询
Apache Nutch 1.18 配置问题解答
1. 配置Nutch平等对待所有域名
要让Nutch在选择URL时均衡分配抓取资源给各域名,需调整以下核心配置:
- 限制单域名每次生成的URL数量:修改
conf/nutch-site.xml中的generate.max.per.domain参数,设置固定值(例如50),确保每次generate阶段每个域名最多输出指定数量的URL,避免单个域名占用过多抓取配额。 - 启用域名级别选择器:将
generator.selector设置为org.apache.nutch.crawl.DepthDomainSelector,该选择器会按域名深度和数量均衡分配URL。 - 关闭外部链接抓取:设置
db.ignore.external.links为true,防止爬虫从某域名跳转到其他站点后,过度抓取外部内容。 - 均衡单域名抓取线程:调整
fetcher.threads.per.queue(建议设为1-3)和fetch.server.delay(例如2000毫秒),避免单域名被高频抓取,同时保证各域名抓取速率一致。
2. 配置Nutch优先爬取较少被爬取的网站
要实现优先抓取低抓取量站点,可从生成阶段的排序和评分逻辑入手:
- 修改Generate阶段排序规则:在
nutch-site.xml中设置generator.sort.mode为ascending,结合org.apache.nutch.crawl.DomainCountComparator,让生成队列优先选择抓取页面数少的域名的URL。 - 自定义评分规则:扩展
ScoringFilter接口,实现对抓取次数少的域名的URL额外加分,提升其优先级。例如在updateScore方法中,根据域名抓取记录数调整URL的score值。 - 调整种子URL初始评分:在种子文件中为低抓取量域名的URL设置更高初始score(种子文件格式:
URL\tscore\tmetadata),让这类URL在初期优先被选中。
3. 域名统计数量不足及获取全种子统计的方法
为什么仅统计到约3k个域名?
domainstats命令仅统计已被成功抓取或生成过URL队列的域名,种子中未被处理的域名(比如未进入generate阶段、解析失败、被robots.txt拦截)不会出现在统计结果中;同时你设置的generate.max=500,每次generate仅生成500个URL,远小于10k种子规模,导致多数种子域名还未被轮询到。
如何获取所有种子URL的统计(含未被找到的)?
- 提取种子域名并对比:
- 用脚本解析种子文件提取所有唯一域名,例如:
awk -F/ '{print $3}' seeds.txt | sort | uniq > seed_domains.txt - 运行
bin/nutch domainstats crawl/crawldb > crawled_domains.txt导出已抓取域名统计 - 用
comm或其他工具对比两个文件,差集即为未被抓取的种子域名
- 用脚本解析种子文件提取所有唯一域名,例如:
- 排查未被抓取的原因:
- 查看
logs/generator.log,确认哪些种子URL未被选中生成队列 - 查看
logs/fetcher.log和logs/parse.log,排查域名解析失败、robots拦截、HTTP错误等问题
- 查看
- 扩大每次生成的URL数量:适当调高
generate.max参数(例如设为2000),或增加generate/fetch循环次数,让更多种子域名被处理
内容的提问来源于stack exchange,提问作者Hafiz Muhammad Shafiq
相关产品推荐
相关产品推荐

