我正在使用Rake任务运行多个抓取脚本,并将一个站点的35个不同城市的类别数据导出到35个不同的CSV文件。
我遇到的问题是,当我从文件夹的根目录运行主Rake任务时,它会在父目录“resultsForCity.csv”中创建一个新文件,而不是在给定的当前CSV文件中查看子文件夹并将数据添加到其中。为了解决这个问题,我想我应该让我的主Rake任务(在父目录中)运行slave Rake任务然后运行抓取脚本,但这也不起作用。
但是,如果我cd
进入其中一个城市文件夹并从那里运行刮刀或Rake任务,它会将数据添加到该子文件夹中的相应CSV文件中。我没有明确定义依赖关系或其他什么?
我尝试过的事情:
这是我的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
任何帮助都会非常感激。
答案 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