2010-12-09 47 views
1

我开始编写scrapers来从不同网站获取数据。我在rake文件中构建了第一个刮板,现在开始编写第二个rake文件以从第二个站点获取数据。现在,我正在为每个我感兴趣的站点撰写特定的刮板(而不是试图构建通用刮板)。使用导轨刮取Rake任务

我有3个问题:

  1. 正在写Rake任务一个很好的选择吗?我应该考虑哪些替代方案?

  2. 如何添加函数/方法到我的耙文件? (对不起,非常愚蠢的问题,但我不知道如何构建我的代码......所以现在它只是500行不间断代码在一个长方法),例如,我想要一个“get_description(节) “从页面返回描述的方法。该方法可能会有所不同,具体取决于我要抓取的网站。

  3. 如何使用RSpec测试我的任务?我想给一个链接,并确保我的任务输出符合我期望得到的结果

感谢您的帮助!如果你想使用它,你还可以检查出thor它使用更标准的红宝石般的语法,而不是DSL耙为您提供

回答

3

作为一般原则,rake任务应该非常小。将实际行为指向真实的类。这些类可以很容易地测试。

例子:

task :scrape do 
    Scraper.scrape! 
end 

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

describe Scraper do 
    # your tests 
end 

,你可以作为@brad表明,使用雷神,这本身具有普通类结构,所以理论上它应该是更容易测试任务本身。但我没有这样做。

你可以在rake中定义方法,但我不知道它们在哪里结束。你不应该这样做,所以不要打扰。最小化任务机构,编写正常的代码来完成肮脏的工作。

+0

太棒了,这有助于很多!看来这是我应该遵循的路线...只有一个问题:我想避免在我的Rails应用程序的“模型”文件夹中包含我的Scraper特定模型。如何为Scraper特定模型创建文件夹(常见功能为scraper.rb,site1特定功能为site1.rb等),并让我的rake任务“查看”它? – alex 2010-12-09 19:25:36

1
  1. 当然耙细。

  2. Rake只是另一个Ruby库,所以你可以在其中包含任何你喜欢的东西。因此,您可以编写自己的库并将其加载到rake文件中。看看如何Bundler does it举例。他们刚刚定义了自己的类,然后在其中创建了任务。它使用了顺便说一句,从我可以收集到的代理耙地这些任务,虽然没有真正彻底地查看它,但我可能是错的。

  3. 如果要定义你自己的事情库,只需要Rspec,你通常会为任何其他项目,然后勾该库进耙或托尔与不择手段,你是去比赛