2010-12-09 6 views
1

Je commence à écrire des scrapers pour obtenir des données de différents sites Web. J'ai construit le premier scraper dans un fichier rake et je commence maintenant à écrire un deuxième fichier rake pour obtenir des données d'un second site. Pour l'instant, j'écris un grattoir spécifique à chaque site qui m'intéresse (sans essayer de construire un grattoir générique).Rake tâche pour racler avec des rails

J'ai 3 questions:

  1. est d'écrire des tâches rake un bon choix pour moi? Existe-t-il des alternatives que je devrais envisager?

  2. Comment puis-je ajouter des fonctions/méthodes à mes fichiers Rake? (désolé, des questions très stupides, mais je ne peux pas comprendre comment structurer mon code ... donc pour l'instant c'est juste 500 lignes de code ininterrompu dans une longue méthode) par exemple, je voudrais un "get_description (section) "méthode qui renvoie la description de la page. La méthode pourrait être différente selon le site que je gratte. Comment tester ma tâche avec RSpec? Je voudrais donner un lien et m'assurer que la sortie de mes tâches correspond à ce que je m'attends à obtenir

Merci pour votre aide!

Répondre

3

En règle générale, les tâches de râteau doivent être très minimes. Référer le comportement réel aux vraies classes. Ces classes peuvent ensuite être facilement testées.

Exemple:

task :scrape do 
    Scraper.scrape! 
end 

class Scraper 
    def self.scrape! 
    # do something 
    end 
end 

describe Scraper do 
    # your tests 
end 

Vous pourriez, comme @brad indiqué, l'utilisation thor, qui a une structure de classe régulière par lui-même, en théorie, il devrait être plus facile de tester eux-mêmes les tâches. Je n'ai pas fait cela cependant.

Vous pouvez définir des méthodes dans rake, mais je ne sais pas où elles aboutissent. Vous ne devriez pas faire ça, alors ne vous embêtez pas. Gardez les corps de tâche au minimum, écrivez le code normal pour faire le sale boulot.

+0

Génial, cela aide beaucoup! Il semble que ce soit la voie que je devrais suivre ... Juste une question: je voudrais éviter d'avoir mes modèles spécifiques Scraper dans le dossier "models" de mon application Rails. Comment puis-je créer un dossier pour les modèles spécifiques de Scraper (scraper.rb pour les fonctions communes, site1.rb pour les fonctions spécifiques à site1, etc) et mes tâches rake "le voient"? – alex

+0

Créez quelque chose comme 'app/scraper/site1.rb'. Si vous utilisez Rails 3, vous pouvez ajouter n'importe quel répertoire dans l'application qui sera automatiquement (paresseux) chargé.Chargez l'environnement pour vos tâches: 'task: site_1 =>: environnement do'. Si vous ne voulez pas charger les rails entiers, demandez les fichiers manuellement. – iain

+0

Super! Je suis toujours sur 2.3.8 ... alors j'ai dû charger le dossier en ajoutant ** config.load_paths << "# {RAILS_ROOT}/app/scrapers" ** à mon fichier environment.rb. Merci pour l'aide! – alex

1
  1. râteau Bien sûr est très bien si vous voulez l'utiliser, vous pouvez également consulter thor qui utilise la syntaxe rubis comme plus standard plutôt que le râteau dsl vous fournit. Le râteau est juste une autre bibliothèque de rubis ainsi vous pouvez inclure tout ce que vous aimez dedans là. En tant que tel, vous pouvez écrire votre propre bibliothèque et le charger dans votre fichier Rake. Découvrez comment Bundler does it par exemple. Ils ont juste défini leurs propres classes, puis créé des tâches à l'intérieur. Il utilise au passage, qui, d'après ce que je peux rassembler d'une manière ou d'une autre ces tâches sur râteau, ne l'a pas vraiment examiné à fond pour que je puisse me tromper.

  2. Si vous définissez les choses dans votre propre bibliothèque, il suffit d'utiliser rspec comme vous le feriez normalement pour tout autre projet, puis accrochez cette bibliothèque en râteau ou thor avec quelque moyen que ce et vous êtes hors de la course

Questions connexes