我正在使用Anemone
抓取一个大型网站,更糟糕的是,这个网站在几个不同的语言版本上有相同的内容。
主要语言为domain.com/
,其他语言为domain.com/de/
, domain.com/es/
,因此我决定在爬行中排除这些,如下所示:
crawler = Anemone::Core.new('http://domain.com', opts = {skip_query_strings: true})
crawler.skip_links_like(/(.+com/(fi|de|it|no|se|en-bm|dk|fr|ie|en-nz|es|int).*)|(.(jpg|pdf|png|jpeg)$)/)
然而,当查看通过on_every_page do |page|
块中的puts page.url
抓取的内容时,我可以看到它仍然在抓取所有许多语言变体。
我甚至试着把这个
crawler.focus_crawl{|page| page.links.reject{|i| !i.to_s.match(/(.+com/(fi|de|it|no|se|en-bm|dk|fr|ie|en-nz|es|int).*)|(.(jpg|pdf|png|jpeg)$)/).nil? }}
从下一个考虑抓取的页面列表中删除语言链接。
有什么建议吗?
原来skip_links_like
方法接受uri而不是url,这意味着您只能匹配顶级域名之后的部分,所以不是这样:
crawler.skip_links_like(/(.+com/(fi|de|it|no|se|en-bm|dk|fr|ie|en-nz|es|int).*)|(.(jpg|pdf|png|jpeg)$)/)
我必须用这个:
crawler.skip_links_like(/(^/(fi|de|it|no|se|en-bm|dk|fr|ie|en-nz|es|int).*)|(.(jpg|pdf|png|jpeg)$)/)
或者仅仅是REGEX差异:
错误:.+com/(fi|de|it|no|se|en-bm|dk|fr|ie|en-nz|es|int).*
右:^/(fi|de|it|no|se|en-bm|dk|fr|ie|en-nz|es|int).*