I’ve had versions of this script hacked together before. In fact, if you search for “Google Analytics Data Extractor” the #1 result is a google groups posting I made in a former life for a C# program I developed: http://groups.google.com/group/analytics-help-misc/browse_thread/thread/d2ad6ddf3d73e511
There’s now a couple of ruby gems out there for handling the Google Analytics API
One of them I’ve been doing some light-contributing to, including the pagination support (automatically grab all results in 10,000 result chunks)
I pushed a couple of changes up today at: http://github.com/er1c/gattica that hopefully will get merged into the main trunk soon (http://github.com/activenetwork/gattica)
One of the more useful uses of the library is to extract your Organic Search Results Keywords from Google Analytics. We’re using this at Frugal Mechanic to see how people search for Auto Parts.
require 'rubygems' require 'gattica' require 'fastercsv' ga_profile = "" #Enter your Profile Here start_date = Date.new(2009, 1, 1) end_date = Date.new(2009, 12, 31) file_path = "data" # Directory Needs to exist puts "Google Username: " u = gets.chomp raise "bad username" unless !u.empty? puts "Google Password: " system "stty -echo" pw = gets.chomp system "stty echo" raise "bad password" unless !pw.empty? class ExtractKeywords def initialize(email,password) @gs = Gattica.new({:email => email, :password => password}) end def get_accounts results = [] @gs.accounts.each{|account| profile = {} profile[:site_title] = account.title profile[:profile_id] = account.profile_id ## this is the id required for requests to the API profile[:account_name] = account.account_name profile[:account_id] = account.account_id profile[:web_property_id] = account.web_property_id results << profile } return results end def connect_profile(profile) @gs.profile_id = profile[:profile_id] end def connect_profile_id(profile_id) @gs.profile_id = profile_id end def get_keywords(start_date = nil, end_date = Date.today) results = [] csv_data = @gs.get({ :start_date => (start_date || (end_date - 365)).to_s, :end_date => end_date.to_s, :dimensions => ["medium", "keyword", "landingPagePath"], :metrics => "entrances", :sort => "-entrances", :page => true}).to_csv(:long) return FasterCSV.parse(csv_data, :headers => true) end end gs = ExtractKeywords.new(u, pw) gs.connect_profile_id(ga_profile) (start_date .. end_date).each { |date| file = "#{file_path}/medium_keyword_landingpage_visits_#{date.strftime('%Y-%m-%d')}.csv" next if File::exists?( file ) FasterCSV.open(file, "w") do |csv| csv << ["medium", "keyword", "landingPagePath", "entrances"] keywords = gs.get_keywords(date, date) keywords.each{|row| csv << [row["medium"], row["keyword"], row["landingPagePath"], row["entrances"]] } end }
Leave a Reply