如何一次运行多个rake任务?

时间:2014-11-29 01:50:18

标签: ruby rake rake-task

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

我遇到的问题是,当我从文件夹的根目录运行主Rake任务时,它会在父目录“resultsForCity.csv”中创建一个新文件,而不是在给定的当前CSV文件中查看子文件夹并将数据添加到其中。为了解决这个问题,我想我应该让我的主Rake任务(在父目录中)运行slave 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 

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

如果您让刮刀脚本获取输出文件名并使用目录结构来帮助您构建输出文件名,该怎么办。

假设你有一个类似

的目录树
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