Ruby on rails 用铁轨刮削的耙子任务

Ruby on rails 用铁轨刮削的耙子任务,ruby-on-rails,rspec,screen-scraping,rake,Ruby On Rails,Rspec,Screen Scraping,Rake,我开始编写scraper来从不同的网站获取数据。我在一个rake文件中构建了第一个scraper,现在开始编写第二个rake文件以从第二个站点获取数据。现在,我正在为我感兴趣的每个站点编写一个特定的刮板(而不是尝试构建一个通用刮板) 我有3个问题: 写rake任务对我来说是个不错的选择吗?有没有其他选择我应该考虑? 如何将函数/方法添加到rake文件?(很抱歉,这些问题很愚蠢,但我不知道如何构造我的代码……所以现在在一个长方法中只有500行不间断的代码)例如,我想要一个“get_descript

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

我有3个问题:

  • 写rake任务对我来说是个不错的选择吗?有没有其他选择我应该考虑?

  • 如何将函数/方法添加到rake文件?(很抱歉,这些问题很愚蠢,但我不知道如何构造我的代码……所以现在在一个长方法中只有500行不间断的代码)例如,我想要一个“get_description(section)”方法,从页面返回描述。方法可能会有所不同,这取决于我正在抓取的站点

  • 如何使用RSpec测试我的任务?我想给出一个链接,确保我的任务的输出与我期望得到的匹配

  • 谢谢你的帮助

  • 如果您想使用rake,当然rake是可以的,您还可以查看哪个使用了比dsl-rake更标准的ruby-like语法

  • Rake只是另一个ruby库,所以您可以在其中包含任何您喜欢的内容。因此,您可以编写自己的库并将其加载到rake文件中。举例来说,看看是如何做到的。他们刚刚定义了自己的类,然后在其中创建了任务。顺便说一句,它使用了thor,根据我收集到的数据,它以某种方式将这些任务代理到rake上,但它并没有真正彻底地检查一遍,所以我可能是错的

  • 如果您在自己的库中定义内容,只需像通常在任何其他项目中一样使用rspec,然后以任何方式将该库连接到rake或thor中,您就可以开始比赛了


  • 作为一般原则,rake任务应该非常少。将实际行为引用到实际类。这些类可以很容易地进行测试

    例如:

    task :scrape do
      Scraper.scrape!
    end
    
    class Scraper
       def self.scrape!
         # do something
       end
    end
    
    describe Scraper do
      # your tests
    end
    
    正如@brad所指出的,您可以使用thor,它本身就有一个规则的类结构,因此理论上应该更容易测试任务本身。不过我还没那么做


    您可以在rake中定义方法,但我不知道它们最终会出现在哪里。你不应该那样做,所以不用麻烦了。尽量减少任务主体,编写普通代码来完成脏活。

    太好了,这很有帮助!看来这是我应该走的路线。。。只有一个问题:我想避免我的Rails应用程序的“models”文件夹中有我的特定于刮板的模型。我如何才能为特定于Scraper的模型(Scraper.rb用于通用功能,site1.rb用于特定于site1的功能等)创建一个文件夹,并让我的rake任务“查看”它?创建类似于
    app/Scraper/site1.rb的内容。如果您使用的是Rails 3,您可以在应用程序中添加任何将自动(延迟)加载的目录。为任务加载环境:
    task:site_1=>:environment do
    。如果您不想加载整个rails环境,那么需要手动加载这些文件。太好了!我还在2.3.8上。。。因此,我必须通过添加**config.load\u路径来加载文件夹