2016-06-23 10 views
0

Ich möchte einen Shop mit Ruby, Nokogiri und Mechanize crawlen.So vermeiden Sie doppelte Einträge beim Crawlen einer Site

Auf einer Seite mit zwei Artikel gezeigt, weiß ich, dass alle Artikel mit .../p/... in der Adresse beginnen, so dass ich dies in article_links speichern. Alle /p/ Links sollten angezeigt werden.

Normalerweise würde ich zwei Adressen siehe:

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 

jedoch am Ende jeder Verbindung dupliziert, die bereits vor der Schleife passiert, so dass ich zu sehen bekommen:

exampleshop.com/p/productxy.html 

exampleshop.com/p/productxy.html 

exampleshop.com/p/productab.html 

exampleshop.com/p/productab.html 

Ich glaube, dass es für jedes Produkt im Code der Site zwei hrefs mit /p/ gibt. Gibt es einen guten Weg, dies zu verhindern? Oder ist es möglich, Nokogiri CSS in links_with zu verwenden?

+0

Es ist schwierig, das Problem ohne HTML-Beispiel zu duplizieren. Siehe "[mcve]". 'map' ist der falsche Iterator dafür. Sie sollten 'each' verwenden, wenn Sie keinen modifizierten Wert zuweisen müssen, während Sie über 'article_links' laufen. 'map' wird die gleichen Dinge zurückgeben, die' target_URL' zugewiesen sind. Je nachdem, wie dieses Code-Snippet verwendet wird, kann es zu doppelten Informationen kommen. –

Antwort

1

Sie könnten die Duplikate vor iterieren der Liste entfernen:

Statt

article_links.map do |link| 

Schreib

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

, die alle Links mit einem doppelten uri entfernen.

könnten Sie CSS regex selectors anstelle von links_with, aber Sie müssen noch Duplikate in Ruby entfernen:

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

Der Grunde, warum Sie noch Duplikate in Ruby entfernen müssen, dass CSS keine Möglichkeit hat zu Wählen Sie das erste Element einer Übereinstimmung aus. nth-of-type oder nth-child würde hier nicht funktionieren.

Verwandte Themen