Nutch配置仅爬取英文页面后仍捕获西语URL的解决问询
Nutch 西语链接拦截配置调整方案
核心原因说明
你之前加的http.accept.language配置只是在发HTTP请求时带个语言偏好头,告诉目标服务器你想优先获取英语内容,根本管不住爬虫顺着页面超链接往队列里添加西语路径的地址。只要这类链接没被过滤规则拦住、匹配你初始设置的爬取范围,就会被正常抓回来,这就是为什么配置完还是能碰到/es-us/这类西语链接的原因。
第一步:nutch-site.xml 配套配置调整
不能仅靠请求头配置,需要从爬取流程层面补两层兜底能力,避免漏拦:
- 首先要把语言识别插件加载上,否则光靠URL特征拦截总有漏网之鱼。在
plugin.includes的配置值里把language-identifier加进去,保证插件列表包含语言识别能力即可,常用的基础配置可以参考:<property> <name>plugin.includes</name> <value>protocol-httpclient|urlfilter-regex|parse-(html|tika)|index-(basic|anchor)|language-identifier|scoring-opic|urlnormalizer-(pass|regex|basic)</value> </property> - 加载完语言识别插件后,补充页面语言黑白名单配置,直接从内容层面判定页面语言属性,哪怕链接里没带西语标识也能拦住不符合要求的页面:
<property> <name>content.language.whitelist</name> <value>en</value> <description>仅保留识别内容为英语的页面,其余语言直接丢弃</description> </property> <property> <name>content.language.blacklist</name> <value>es,ca,eu,gl,ast,ext</value> <description>明确拉黑所有西语及西语地区关联方言的页面</description> </property>
第二步:regex-urlfilters.txt 规则优化
Nutch 自带的 regex-urlfilters 是按行从上到下匹配的:+开头的是放行规则,-开头的是拦截规则,只要匹配到一条就会终止后续校验。针对你提到的/es-us/类带语言路径的西语链接,可添加以下精准拦截规则,注意一定要把拦截规则写在自身爬取目标的放行规则之后,避免误拦正常链接:
- 拦截路径第一层为西语语言/地区标识的链接(覆盖你提到的
/es-us/场景及所有常见西语路径前缀):-^https?://([a-z0-9-]+\.)*[^/]+/(es|es-es|es-us|es-mx|es-ar|es-co|es-cl|es-pe|es-ve|es-ec|es-gt|es-cu|es-bo|es-hn|es-py|es-sv|es-ni|es-do|es-pr|es-uy|es-pa)(/|$) - 拦截URL参数携带西语语言标识的链接(覆盖部分网站通过参数切换语言的场景):
-^https?://([a-z0-9-]+\.)*[^/?]+\?.*([?&](lang|language|locale)=es)(&|$)
配置验证方法
调整完配置不要直接跑全量爬虫,可通过Nutch内置工具单测校验规则匹配结果,减少漏拦或误拦的概率:
bin/nutch org.apache.nutch.net.URLFilterChecker https://www.google.com/es-us/asdfghjk
如果返回被上述拦截规则拒绝的结果,就说明规则匹配逻辑生效。
内容的提问来源于stack exchange,提问作者Raj Kasha
相关产品推荐
相关产品推荐

