我正在使用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)$)/)
然而,当查看puts page.url
块中on_every_page do |page|
抓取的内容时,我发现它仍在抓取所有语言变体。
我甚至试图加入此
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? }}
从要抓取的网页列表中的下一个内容中删除语言链接。
有什么建议吗?
答案 0 :(得分:0)
原来skip_links_like
方法取URI而不是URL意味着你只能匹配顶级domian之后的部分而不是这个:
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).*