【问题标题】:Rake task for scraping with rails用导轨刮擦的耙子任务
【发布时间】:2023-03-18 08:13:01
【问题描述】:

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

我有 3 个问题:

  1. 编写 rake 任务对我来说是一个不错的选择吗?我应该考虑其他替代方案吗?

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

  3. 如何使用 RSpec 测试我的任务?我想提供一个链接,并确保我的任务输出符合我的预期

感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails rspec screen-scraping rake


    【解决方案1】:

    作为一般原则,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 中定义方法,但我不知道它们最终会在哪里结束。你不应该那样做,所以不要打扰。尽量减少任务主体,编写普通代码来完成脏活。

    【讨论】:

    • 太好了,这很有帮助!看来这是我应该遵循的路线......只有一个问题:我想避免将我的 Scraper 特定模型放在我的 Rails 应用程序的“模型”文件夹中。如何为 Scraper 特定模型创建一个文件夹(scraper.rb 用于通用功能,site1.rb 用于特定于 site1 的功能等)并让我的 rake 任务“看到”它?
    • 创建类似app/scraper/site1.rb 的内容。如果您使用的是 Rails 3,您可以在应用程序中添加将自动(延迟)加载的任何目录。为您的任务加载环境:task :site_1 => :environment do。如果您不想加载整个 rails env,请手动请求文件。
    • 太棒了!我仍在使用 2.3.8... 所以我必须通过将 ** config.load_paths
    【解决方案2】:
    1. 如果你想使用 rake 肯定没问题,你也可以查看thor,它使用更标准的类似 ruby​​ 的语法,而不是 dsl rake 提供给你。

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

    3. 如果您在自己的库中定义东西,只需像往常对任何其他项目一样使用 rspec,然后以任何方式将该库挂接到 rake 或 thor 中,然后您就可以参加比赛了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 2012-04-07
      • 2020-01-09
      • 2021-09-06
      相关资源
      最近更新 更多