2011-10-01 1 views
2

Quelle est la solution simpiest avec Mechanize pour voir si une page a été mise à jour?Mécaniser - moyen le plus simple de vérifier si la page a été mise à jour?

Je pensais à créer une table nommée pages.

qui aurait:

pagename - varchar 
page - text 
pageupdated - boolean 

Comment dois-je créer le grattoir écran et enregistrer les données dans la base de données? Et comment créer une méthode pour comparer le html dans la table avec les données grattées. Pour vérifier si la page a été mise à jour.

Répondre

1

Réponse mise à jour et testée.

Voici un exemple en utilisant un modèle de page (et en utilisant retryable-rb):

rails génèrent nom Page d'échafaudage: string remote_url: page Chaîne: texte digest: Texte page_updated: booléen

####### 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 Suis à peu près sûr que c'est une question sans rapport, mais je semble rencontrer un LoadError en essayant de require 'mechanize' en rails console et mon application de test. Je ne suis pas sûr de la cause, mais je mettrai à jour ma réponse lorsque je pourrai tester cette solution avec succès.

Assurez-vous que vous vous souvenez d'ajouter à votre application de Gemfile:

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

Exemple d'utilisation:

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 
Questions connexes