2011-10-01 6 views
2

Mechanize를 사용하여 페이지가 업데이트되었는지 확인하는 simpiest 솔루션은 무엇입니까?Mechanize - 페이지가 업데이트되었는지 확인하는 가장 간단한 방법은 무엇입니까?

페이지라는 테이블을 만들려고했습니다.

것이라는 점 :

pagename - varchar 
page - text 
pageupdated - boolean 
나는 데이터베이스의 데이터를 화면 스크레이퍼를 생성하고 저장하는 방법

? 그리고 테이블의 html과 스크랩 한 데이터를 비교하는 방법을 만드는 법. 페이지가 업데이트되었는지 확인하려면.

답변

1

답변이 업데이트되고 테스트되었습니다.

레일 발판 페이지 이름을 생성 : : 문자열 remote_url는 : 문자열 페이지 : 텍스트 소화 : 텍스트 page_updated : 부울

####### app/models/page.rb 

require 'digest' 
require 'retryable' 

class Page < ActiveRecord::Base 
    include Retryable 

    # Scrape page before validation 
    before_validation :scrape_content, :if => :remote_url? 

    # Will cause save to fail if page could not be retrieved 
    validates_presence_of :page, :if => :remote_url?, :message => "URL provided is invalid or inaccessible." 

    # Update digest if/when all validations have passed 
    before_save :set_digest 

    # ... 

    def update_page! 
    self.scrape_content 
    self.set_digest 
    self.save! 
    end 

    def page_updated? 
    self.page_updated 
    end 

    protected 

    def scrape_content 
    ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X) ' + 
     'AppleWebKit/535.1 (KHTML, like Gecko) ' + 
     'Chrome/14.0.835.186 Safari/535.1' 

    # Using retryable, create scraper and get page 
    scraper = Mechanize.new{ |i| i.user_agent = ua } 
    scraped_page = retryable(:times => 3, :sleep => false) do 
     scraper.get(URI.encode(self.remote_url)) 
    end 
    self.page_updated = false 
    self.page = scraped_page.content 
    self.name ||= scraped_page.title 
    self.digest ||= Digest.hexencode(self.page) 
    end 

    def set_digest 
    # Create new digest of page content 
    new_digest = Digest.hexencode(self.page) 

    # If digest has changed, update digest and set flag 
    if (new_digest != self.digest) && !self.digest.nil? 
     self.digest = new_digest 
     self.page_updated = true 
    else 
     self.page_updated = false 
    end 

    true 
    end 

end 

I

여기 (retryable-rb 및 사용) 페이지 모델을 사용하는 예입니다 상당히 관련없는 문제이지만, require 'mechanize'rails console과 내 테스트 응용 프로그램을 쓰려고 할 때 LoadError이 발생하는 것으로 보입니다. 이 문제를 일으키는 원인을 알 수는 없지만이 솔루션을 성공적으로 테스트 할 수있을 때 내 대답을 업데이트합니다.

gem 'mechanize', '2.0.1' 
gem 'retryable-rb', '1.1.0' 

사용 예 :

당신은 응용 프로그램의 Gemfile이를 추가 할 수 있는지 기억하게

p = Page.new(:remote_url => 'http://rubyonrails.org/') 
p.save! 
p.page_updated? # => false, since page hasn't been updated since creation 
p.remote_url = 'http://www.google.com/' # for the sake of example 
p.update_page! 
p.page_updated? # => true 
관련 문제