Download Google keywords through SUDS

There are sometimes situations where you may want to download all the keywords (criteria) uploaded to Google Adwords and if you have substantial keyword basket (say, more than a million), then either downloading manually or checking through the tools provided by Google become prohibitive.  Also, Google daily keyword performance report provides metrics for all the keywords that have had at least one impression.

Following application is a simple tool that downloads all keywords and dumps that data to different files.    I have removed error handling code and hardcoded many values to simplify it and you can modify this your requirements and don't forget to add your account and API details.  I have been able to download few million keywords using multiple processes.

Environment:
Ubuntu karmic OS running Python 2.6.4 for Adwords API version 13 (V13) using Python SUDS SOAP module.



#-- Python application to pull all your campaign keywords.
#-- Uses suds SOAP module to connect to Google Services and writes to files (one for each client email).
#--   Get list of all client emails (typically multiple accounts created to handle large set of keywords)
#--      For each account get its campaigns
#--        For each campaign get its adgroups
#--          For each adgroup get all keywords
#--            print ids and keyword attributes

import sys
import time
import re

import traceback as tb
import suds.metrics as metrics

from suds import WebFault
from suds.client import Client

#-- A class to handle user details...
#--------------------------------------
class GoogleSoapUser:
    def __init__(self):
        self.user = {'email'     : 'your_developer_api_email_addr',
                     'password'  : 'your_developer_password',
                     'useragent' : 'Google Adwords KW pull V0.1',
                     'developerToken' : 'your_developer_token',
                     'applicationToken' : 'your_application_token'
                     }
        #-- Note: connecting to production (adwords); for sandbox testing replace it.
        self.wsdl = {'campaign' :'https://adwords.google.com/api/adwords/v13/CampaignService?wsdl',
                     'adGroup'  :'https://adwords.google.com/api/adwords/v13/AdGroupService?wsdl',
                     'keyword'  :'https://adwords.google.com/api/adwords/v13/CriterionService?wsdl'
                     }
        
    def getUser(self):
        return self.user

    def getWSDL(self, k=None):
        return self.wsdl[k]
         
    def getClientEmails(self):  #-- Client emails to pull data for
        emails = ['your_campaign_ac_email_addr_1', 
                  'your_campaign_ac_email_addr_2',
                  'your_campaign_ac_email_addr_3'
                  ]
        return emails
    
    def setHeaderEmail(self, clientEmail=None):
        self.user['clientEmail'] = clientEmail

        
#-- Main program
#------------------------------
if __name__ == '__main__':
    gUser = GoogleSoapUser()
    
    #-- For each client email...
    for cEmail in gUser.getClientEmails():
        #-- Open a output file to dump...
        print "Checking account: ", cEmail, "\n"
        file = 'google_' + re.split('@', cEmail)[0] + '.txt'
        try:
            f = open('/tmp/'+file, 'w')
        except IOError as err:
            print "Unable to open file", file, format(err)

        #-- Set the SOAP header with client email
        gUser.setHeaderEmail(cEmail)
        
        #-- Get all campaigns...
        campClient = Client(gUser.getWSDL('campaign'))
        campClient.set_options(soapheaders=gUser.getUser())
        campaigns = campClient.service.getAllAdWordsCampaigns(0)  #-- Pass a dummy number...

        #-- For each campaign ...
        for campaign in campaigns:
            campaignID = campaign['id']
            print "Checking for campaign: ", campaignID, "\n"
            adClient = Client(gUser.getWSDL('adGroup'))
            adClient.set_options(soapheaders=gUser.getUser())
            adGroups = adClient.service.getAllAdGroups(campaignID)

            #-- For each AdGroup...
            for adGroup in adGroups:
                adGroupID = adGroup['id']
                print "Checking for adGroup: ", adGroupID, "\n"
                kwClient = Client(gUser.getWSDL('keyword'))
                kwClient.set_options(soapheaders=gUser.getUser())
                keywords = kwClient.service.getAllCriteria(adGroupID)
                
                #-- For each keyword...
                for kw in keywords:
                    f.write(str(campaignID) + '\t' +
                            str(adGroupID)  + '\t' +
                            str(kw['id'])   + '\t' +
                            kw['type']      + '\t' +
                            kw['text']      + '\t' +
                            str(kw['qualityScore']) + '\t' +
                            kw['destinationUrl'] + '\n'
                            )
                    # sys.exit()

        #-- Close this account output file...
        f.close()
        print "Data pull complete for account ", cEmail, "\n"


Cheers,
Shiva

No comments:

Post a Comment