question

SagarSarkar-8057 avatar image
0 Votes"
SagarSarkar-8057 asked ·

Bing ads API using python is tremendous slow

Hi, I am using python sdk(https://pypi.org/project/bingads/) for fetching campaigns, adgroups and keywords. But it is tremendous slow. on the other hand google bing api is so fast. Specially Bing keywords process taking too much time. i am using GetKeywordsByAdGroupId method to fetch all keywords for each adgroup id. i am also fetching all keyword labels by calling another python function as below:
def get_labels(campaign_service, keywordId):
keyword_associated_lables = campaign_service.GetLabelAssociationsByEntityIds(
EntityIds={'long': [keywordId]}, EntityType="Keyword")

 associated_label_ids = []
 associated_label_names = []

 for associated_label in keyword_associated_lables.LabelAssociations:
     for label in associated_label[1]:
         associated_label_ids.append(label.LabelId)

 get_labels_by_ids_response = campaign_service.GetLabelsByIds(
     LabelIds={'long': associated_label_ids}
 )

 for data_object in get_labels_by_ids_response.Labels['Label']:
     associated_label_names.append(data_object.Name)

 return ','.join(associated_label_names)



Now for fetching 12633 keywords and their lables total time taken 4hours 28 min. on the other hand using google ads api(python) fetching google keywords with labels take only 35 min. Even from console i can see the difference of fetching records. is there any way to optimise the process?
Thanks in advance
Sagar

azure-bing-webazure-bing-custom
· 1
10 |1000 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.

Hello,

Thanks for reaching out to us. Could you please a sample data(input) if it's not confidential so that we can take look?

Regards,
Yutong

0 Votes 0 ·

1 Answer

SagarSarkar-8057 avatar image
0 Votes"
SagarSarkar-8057 answered ·

Hello YotonTie, this is script i am using for fetching keywords with labels.
Thank for looking into my problem.

authentication process code which i found in bing python example.

from process.scripts.bing_auth_helper import
from bingads.authorization import

my Models

from remote.models import AdvertisingAccounts, CampaignsDetails, AdGroupDetails, KeywordDetails
import environ
from django.core.exceptions import FieldError, ObjectDoesNotExist
from suds import WebFault
from process.log_message import *
import logging

my Models

from process.models import Log, Process
import sys
from django.db import connection, OperationalError

env = environ.Env()

reading .env file

environ.Env.read_env()


def get_labels(campaign_service, keywordId):
keyword_associated_lables = campaign_service.GetLabelAssociationsByEntityIds(
EntityIds={'long': [keywordId]}, EntityType="Keyword")

 associated_label_ids = []
 associated_label_names = []

 for associated_label in keyword_associated_lables.LabelAssociations:
     for label in associated_label[1]:
         associated_label_ids.append(label.LabelId)

 get_labels_by_ids_response = campaign_service.GetLabelsByIds(
     LabelIds={'long': associated_label_ids}
 )

 for data_object in get_labels_by_ids_response.Labels['Label']:
     associated_label_names.append(data_object.Name)

 return ','.join(associated_label_names)


def get_keywords(adgroup, log_id):
campaign = CampaignsDetails.objects.filter(
id=adgroup.Campaign_id).select_related('Account').using('remote_staging')
account_id = campaign[0].Account.account_id
# print(campaign.query)
# print("account_id=%s" % (account_id))
# print("adgroup ID=%s" % (adgroup.Adgroup_Id))
created = 0
updated = 0
total = 0
# return_additional_fields = 'AdGroupType'
authorization_data = AuthorizationData(
account_id=account_id,
customer_id=None,
developer_token=env('DEVELOPER_TOKEN'),
authentication=None,
)
campaign_service = ServiceClient(
service='CampaignManagementService',
version=13,
authorization_data=authorization_data,
environment=env('ENVIRONMENT'),
)
try:
authenticate(authorization_data)
keywords = campaign_service.GetKeywordsByAdGroupId(
AdGroupId=adgroup.Adgroup_Id)
if keywords != "":
for keyword in keywords.Keyword:
total = total+1
keyword_id = keyword.Id
keyword_name = keyword.Text
keyword_status = keyword.Status
keyword_matchtype = keyword.MatchType
lbl_names = get_labels(campaign_service, keyword_id)
print("%s Keyword found for Keyword ID %s" %
(keyword_name, keyword_id))
print("%s Keyword found" % (total))
print("Keyword id=%s Name=%s Status=%s Match Type=%s labels=%s" %
(keyword.Id, keyword.Text, keyword.Status, keyword.MatchType, lbl_names))
try:
keyword_details = KeywordDetails.objects.filter(
Adgroup_id=adgroup.id, Keyword_Id=keyword_id
).using('remote_staging')
except FieldError as e:
saveLog(log_id=log_id, status=Log.Statuses.FAILURE,
log_message=e)
sys.exit()
if keyword_details.count() != 0:
if(keyword_details[0].Name != keyword_name or keyword_details[0].Match_Type != keyword_matchtype or keyword_details[0].Status != keyword_status):
print("updating Bing Keywords %s" % (keyword_name))
keyword_details.update(
Name=keyword_name,
Match_Type=keyword_matchtype,
Status=keyword_status,
Labels=lbl_names,
)
updated = updated + 1
else:
# insert
print('inserting Bing Keywords' + keyword_name)
try:
newKeyword = KeywordDetails(
Keyword_Id=keyword_id,
Name=keyword_name,
Match_Type=keyword_matchtype,
Status=keyword_status,
Labels=lbl_names,
Adgroup_id=adgroup.id,
)
newKeyword.save(using='remote_staging')
created = created + 1
except OperationalError:
print(connection.queries[-1])
except Exception as e:
template = "An exception of type {0} occurred. Arguments:\n{1!r}"
print(template.format(type(e).name, e.args))
else:
print("No Keywords found for Adgroup ID %s" % (adgroup.Adgroup_Id))
return [created, total, updated]
except WebFault as ex:
print(ex)
except Exception as ex:
print(ex)


def run_keyword_task(log_id=0):

 created = 0
 updated = 0
 total = 0
 message = []
 logProcessStarted(log_id)

 adgroups = AdGroupDetails.objects.filter(
     Campaign__Account__source="bing_ads_search", Campaign__Account__isActive=1).distinct().using('remote_staging')
 # print(adgroups.query)

 for adgroup in adgroups:
     # print(adgroup.Adgroup_Id)
     # print(adgroup.Campaign_id)
     try:
         print("Fetching  Bing Keywords  for Adgroup ID=%s" %
               (adgroup.Adgroup_Id))
         stats = get_keywords(adgroup, log_id)
         if stats != False:
             created += stats[0]
             total += stats[1]
             updated += stats[2]
         logProcessStats(log_id, created, total, updated)
     except ValueError:
         message.append("ValueError in Account '%s' " %
                        (adgroup.Adgroup_Id))
         saveLog(log_id=log_id, status=Log.Statuses.RUNNING,
                 log_message="ValueError in Account '%s' " % (adgroup.Adgroup_Id))
     except KeyboardInterrupt:
         saveLog(log_id=log_id, status=Log.Statuses.FAILURE,
                 log_message="Forcefully Stopped")
         sys.exit()
     except Exception as e:
         template = "An exception of type {0} occurred. Arguments:\n{1!r}"
         msg = template.format(type(e).__name__, e.args)
         log_message = msg + \
             "Bing Keywords:Error in Adgroup ID '%s' " % (
                 adgroup.Adgroup_Id)
         message.append(log_message)
         pass

 if len(message) == 0:
     logProcessFinished(log_id)
 elif len(message) > 0:
     message.append("Success with some errors")
     log_msg = ','.join(message)[0:244]
     saveLog(log_id=log_id, status=Log.Statuses.FAILURE,
             log_message=log_msg)
 print("Bing Keywords Process Finished")
·
10 |1000 characters needed characters left characters exceeded

Up to 10 attachments (including images) can be used with a maximum of 3.0 MiB each and 30.0 MiB total.