2017-03-20 7 views
0

정보 사이트를 구축하려고합니다. 방문자에게 특정 페이지에있는 특정 판매자의 모든 거래를 보여줍니다. 첫 페이지에서 헤드 라인을 긁어내어 URL 반복을 배열로 관리했습니다.Rails 및 Nokogiri 사이트의 페이지를 반복하는 방법

내 코드는 각 URL을 가져 와서 스크레이퍼에 붙여넣고, 해당 페이지의 항목을 나열하고, 다음 페이지로 반복하고, 헤드 라인을 긁어내어 최근 완료 목록에 첨부하는 등의 작업을 수행해야합니다. 이 2 페이지에 반복 할이 코드

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 

    class Entry 
    def initialize(title) 
     @title = title 
    end 
    attr_reader :title 
    end 


    def scrape_mydealz 
    require 'open-uri' 
    urlarray = Array.new 
    # --------------------------------------------------------------- URL erstellen 
    pagination = '&page=1' 
    count = [1, 2] 
    count.each do |i| 
     base_url = "https://www.mydealz.de/search?q=media+markt" 
     pagination = "&page=#{i}" 
     combination = base_url + pagination 
     urlarray << combination 
    end 
    # ---------------------------------------------------------------/URL erstellen 

    urlarray.each do |test| 
     doc = Nokogiri::HTML(open("#{test}")) 
     entries = doc.css('article.thread') 
     @entriesArray = [] 
     entries.each do |entry| 
      title = entry.css('a.vwo-thread-title').text 
     @entriesArray << Entry.new(title) 
     end 
    end 
    render template: 'scrape_mydealz' 
    end 
end 

및 2 페이지 만에서 스크랩 결과를 표시

내 컨트롤러는 다음과 같습니다.

결과

여기에서 볼 수 있습니다 : https://mm-scraper-neevoo.c9users.io/

+0

thx Nikita, –

+0

"[mcve]"를 읽으십시오. 우리는 귀하의 코드를 실행하여 문제를 보여줄 수 없습니다. 문제를 설명하는 _minimum_ 코드와이를 복제하는 데 필요한 최소 입력 데이터 및 필요한 출력이 필요합니다. 그것 없이는 우리는 부정확 한 결과를 가져오고 누구에게 도움이되지 않는 상상력의 데이터와 결과를 가져야합니다. 결과에 대한 링크는 우리 또는 다른 사람들이 썩어 빠져서 넌센스 질문을하게 만드는 데 도움이되지 않습니다. 기억하십시오. SO는 토론 목록이 아니며 향후 다른 사람들의 문제를 해결하기위한 온라인 참고서입니다. –

+0

URI를 조작하기 위해 URI 클래스를 사용하는 방법을 배우는 것이 좋습니다. 문제를 일으킬 수있는 코너 케이스를 처리하는 방법을 알고 있습니다. ''{{test} '''하지 마라. 'test'는 이미 문자열이므로 리터럴 문자열에 고정시키고 그것을 삽입하지 않고 사용하십시오. 'pagination = '& page = 1 ''을 정의한 다음''pagination = "& page = # {i}"'; 첫 번째 항목을 삭제하지만 URI를 사용하여 쿼리를 작성하는 방법을 배웁니다. 'entry.css ('a.vwo-thread-title'). text'는''a.vwo-thread-title ''이 여러 개 발견되면 문제를 일으킬 것입니다. 'at (...) .text'는 오직 하나 또는'entry.css (...). map (& : text)'만 있으면 사용하십시오. –

답변

0

당신은 각 반복에서 @entriesArray을 다시 초기화. 당신을위한 가장 쉬운 해결책은 루프 밖에서 초기화를 이동

@entriesArray = [] 

urlarray.each do |test| 
    doc = Nokogiri::HTML(open("#{test}")) 
    entries = doc.css('article.thread') 
    entries.each do |entry| 
     title = entry.css('a.vwo-thread-title').text 
     @entriesArray << Entry.new(title) 
    end 
end 
0

이 안된하지만 내가 두 페이지로 사이트를 검색하는 데 사용하고 제목을 축적하려는 일반적인 생각입니다 :

require 'open-uri' 

BASE_URL = 'https://www.mydealz.de/search?q=media+markt&page=1' 

def scrape_mydealz 

    urls = [] 
    2.times do |i| 
    url = URI.parse(BASE_URL) 
    base_query = URI::decode_www_form(url.query).to_h 
    base_query['page'] = 1 + i 
    url.query = URI.encode_www_form(base_query) 
    urls << url 
    end 

    @entries_array = [] 
    urls.each do |url| 
    doc = Nokogiri::HTML(open(url)) 
    doc.css('article.thread').each do |entry| 
     @entries_array << Entry.new(entry.at('a.vwo-thread-title').text) 
    end 
    end 
    render template: 'scrape_mydealz' 
end 

doc = Nokogiri::HTML(<<EOT) 
<html> 
    <body> 
    <p>foo</p> 
    <p>bar</p> 
    </body> 
</html> 
EOT 

doc.search('p').text # => "foobar" 
doc.search('p').map(&:text) # => ["foo", "bar"] 

공지 최초의 연구가 : search, css 또는 xpathtext를 사용하여주의

esult가 <p> 태그의 내용을 연결했습니다. 나중에 그 사람들을 떼어 놓으려고하는 것은 보통 가능하지 않습니다.