2016-06-23 20 views
0

Ruby、Nokogiri、Mechanizeでショップをクロールしたいと思っています。サイトをクロールする重複エントリを避ける方法

2つの記事が表示されているページでは、すべての記事がアドレスに.../p/...で始まることがわかっているので、これをarticle_linksに保存しています。すべて/p/のリンクが表示されます。すでにループの前に起こった、最終的には各リンクが複製され、

agent = Mechanize.new 
page = agent.get(exampleshop.com) 

article_links = page.links_with(href: %r{.*/p/}) 

article_links.map do |link| 
    article = link.click 
    target_URL = page.uri + link.uri #full URL 
    puts "#{target_URL}" 
end 
#crawling stuff on /p/ pages not included here 

しかし、私は見ることが:

通常、私は2つのアドレスを見ることが

exampleshop.com/p/productxy.html 

exampleshop.com/p/productxy.html 

exampleshop.com/p/productab.html 

exampleshop.com/p/productab.html 

私は信じていますサイトのコードには、製品ごとに/p/の2つの階層があることを確認してください。これを防ぐ良い方法はありますか?またはlinks_withでNokogiri CSSを使用することは可能ですか?

+0

サンプルHTMLなしで問題を再現するのは難しいです。 「[mcve]」を参照してください。 'map'はこれに対して間違ったイテレータです。 'article_links'をループするときに変更された値を割り当てる必要がなければ' each'を使うべきです。 'map'は' target_URL'に割り当てられたものと同じものを返すので、コードのスニペットがどのように使われているかによって情報が重複する可能性があります。 –

答えて

1

あなたは、リストを反復処理する前に重複を削除できます。

代わりの

article_links.map do |link| 

は、重複URIを持つすべてのリンクを削除します

article.links.uniq { |link| link.uri }.map do |link| 

を書きます。

あなたが代わりにlinks_withCSS regex selectorsを使用することができますが、あなたはまだRubyで重複を削除する必要があるだろう:

article_links = page.css("a[href*='/p/']") 

あなたはまだRubyで重複を削除する必要があるだろう理由は、CSSがに方法がないということですマッチの最初の要素を選択します。 nth-of-typeまたはnth-childはここでは機能しません。

関連する問題