I am using Google Ads API SDK for Python. I want to get some Ads data and put them into a Dataframe to transform a bit. I made a call with the code below:

client = GoogleAdsClient.load_from_storage("config.yaml") customer_id = '<customer_id>' ga_service = client.get_service("GoogleAdsService") query = """     SELECT         campaign.id,         campaign.name,         customer.id     FROM campaign     """ response = ga_service.search_stream(customer_id=customer_id, query=query) for batch in response:     for row in batch.results:         print(row)         df = pd.DataFrame(row)         print(df) 

Here is the response I receive:

customer {   resource_name: "customers/<customer-id>"   id: <customer-id> } campaign {   resource_name: "customers/<customer-id>/campaigns/<campaign-id>"   name: "Test_campaign_1"   id: <campaign-id> } Traceback (most recent call last):   File "c:\Users\User\main.py", line 36, in <module>     print(dict(row)) TypeError: 'GoogleAdsRow' object is not iterable 

I tried using google.protobuf.json_format to convert the result into json/dict format with the below code

from google.protobuf.json_format import MessageToJson response = ga_service.search_stream(customer_id=customer_id, query=query) for batch in response:     for row in batch.results:         print(row)         jsonobj = MessageToJson(row) 

But I got the below error message:

  File "C:\Users\User\AppData\Local\Programs\Python\Python39\lib\site-packages\proto\message.py", line 605, in __getattr__     raise AttributeError(str(ex)) AttributeError: 'DESCRIPTOR' 

Could you please help me with this? Thank you.

Tag:google-ads-api, python

5 comments.

  1. Toàn Đoàn

    Sorry for bothering, but I found this question and got the answer for my question.

    I changed my code to below (add ._pb to the response):

    response = ga_service.search(customer_id=customer_id, query=query) dictobj = MessageToDict(response._pb) df = pd.json_normalize(dictobj,record_path=['results']) print(df)

    and it works!

    1. Mystic

      '_StreamingResponseIterator' object has no attribute '_pb'

    2. Ankit Tripathi

      Did you find a solution to the above error: _StreamingResponseIterator' object has no attribute '_pb'

  2. D.U.Kim

    Many thanks to Toàn!

    Regarding the questions mentioned in his previous post, I found the following solution to be effective for my situation:

    search_request.query = query stream = gads_service.search_stream(search_request) for batch in stream: dictobj = MessageToDict(batch._pb) df = pd.json_normalize(dictobj,record_path=['results'])
    1. Community

      Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.

Add a new comment.