2016-06-23 4 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 

하지만, 그래서 나는 볼 수 :

일반적으로 나는 두 개의 주소를 볼 것입니다

exampleshop.com/p/productxy.html 

exampleshop.com/p/productxy.html 

exampleshop.com/p/productab.html 

exampleshop.com/p/productab.html 

저는 믿습니다 사이트 코드에 각 제품에 대해 두 개의 href가 /p/ 인 것을 확인하십시오. 이 문제를 방지 할 수있는 좋은 방법이 있습니까? 또는 links_with에서 Nokogiri CSS를 사용할 수 있습니까?

+0

샘플 HTML없이 문제를 복제하기가 어렵습니다. "[mcve]"를 참조하십시오. 'map'은 이것에 대한 잘못된 반복자입니다. 'article_links'를 반복 할 때 수정 된 값을 지정할 필요가 없다면'each'를 사용해야합니다. 'map'은'target_URL'에 할당 된 것과 동일한 것을 반환 할 것이므로 코드의 스 니펫 (snippet)이 어떻게 사용되는지에 따라 중복 된 정보가 될 수 있습니다. –

답변

1

당신은 목록 반복하기 전에 중복을 제거 할 수 있습니다 :

대신 중복 된 URI있는 모든 링크를 제거합니다

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

쓰기

article_links.map do |link| 

의.

대신 links_withCSS regex selectors을 사용할 수 있습니다,하지만 당신은 여전히 ​​루비에서 중복을 제거해야 할 것 :

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

여전히 루비에서 중복을 제거해야 할 것입니다 이유 CSS는 방법으로이 없다고한다 매치의 첫 번째 요소를 선택하십시오. nth-of-type 또는 nth-child은 여기에서 작동하지 않습니다.

관련 문제