【问题标题】:How do I run multiple rake tasks at once?如何一次运行多个 rake 任务?
【发布时间】:2014-11-29 01:50:17
【问题描述】:

我正在使用 Rake 任务,该任务运行多个抓取脚本并将站点的 35 个不同城市的类别数据导出到 35 个不同的 CSV 文件。

我遇到的问题是,当我从文件夹的根目录运行主 Rake 任务时,它会在父目录“resultsForCity.csv”中创建一个新文件,而不是在给定的目录中查看当前的 CSV 文件子文件夹并将数据添加到其中。为了解决这个问题,我认为我应该让我的主 Rake 任务(在父目录中)运行从属 Rake 任务,然后运行抓取脚本,但这也不起作用。

但是,如果我 cd 进入其中一个城市文件夹并从那里运行刮板或 Rake 任务,它会将数据添加到位于该子文件夹中的相应 CSV 文件中。我没有明确定义依赖关系或其他东西吗?

我尝试过的事情:

  • 我已经尝试在我的主 rake 任务中要求每个单独的 rakefile。
  • 尝试遍历所有文件并加载 rake 任务并收到堆栈太深的错误。
  • 尝试在 Stackoverflow 上搜索 7 天。

这是我的 Rake 任务代码:

require "rake"

task default: %w[getData]


task :getData do 

        Rake::FileList.new("**/*.rb*").each do |file| 

         ruby file 

        end 

end 

这是我的爬虫代码:

require "nokogiri"

require "open-uri"

require "csv"

url = "http:// example.com/atlanta"

doc = Nokogiri::HTML(open(url))


CSV.open("resultsForAtlanta.csv", "wb") do |csv|

    doc.css(".tile-title").each do |item|
        csv << [item.text.tr("[()]+0-9", ""), item.text.tr("^0-9$", "")] 
    end 

    doc.css(".tile-subcategory").each do |tile|
        csv << [tile.text.tr("[()]+0-9", ""), tile.text.tr("^0-9$", "")]
    end 



end 

任何帮助都将不胜感激。

【问题讨论】:

  • 这不是一个真正的 Nokogiri 或 CSV 问题。虽然它们在您调用的代码中使用,但它们与您并行运行它们的问题无关,因此将它们放在标签中没有必要,甚至是一个好主意。

标签: ruby rake rake-task


【解决方案1】:

如果您让爬虫脚本获取输出文件名并使用目录结构来帮助您构建输出文件名会怎样。

假设你有一个类似的目录树

Atlanta/scraper.rb
LosAngeles/scraper.rb
...

其中 scraper.rb 是您的抓取脚本,您应该能够像这样编写任务:

task :getData do
  Rake::FileList.new("**/scraper.rb").each do |scraper_script|
    dir = File.dirname(file)
    city = File.basename(dir)
    csv_file = File.join(dir, "resultsFor#{city}.csv")
    ruby [scraper_script, csv_file].join(" ")
  end
end 

然后你的 Ruby 脚本可以像这样从命令行中获取文件名:

CSV.open(ARGV[1], "wb") do |csv|
   ...
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多