【问题标题】:Pardot API to retrieve all records from Prospect tablePardot API 从 Prospect 表中检索所有记录
【发布时间】:2018-08-22 12:42:57
【问题描述】:

我正在使用 Talend 向 Pardot 发出 API 调用并从 Prospect 表中检索记录。 这给了我 200 条记录。 谁能建议一种方法来检索此表中可用的所有记录。

或者如何循环并检索以 200 为单位的记录,并在检索到的记录为零时终止。

【问题讨论】:

    标签: talend pardot


    【解决方案1】:

    您一次只能检索 200 条记录。如果要检索所有记录,则必须使用 offset 参数对其进行循环。这里偏移量每次增加 200,即当您使用 offset=0 时,它将检索前 200 条记录,然后将偏移量增加 200(offset=200)以检索接下来的 200 条记录。这是我在 Python 中将所有记录检索到 csv 文件中的方法。

    i=0
    final_data = pd.DataFrame() #Initialize an empty dataframe
    url = "https://pi.pardot.com/api/Prospect/version/4/do/query? user_key=&api_key=&output=bulk&format=json&sort_by=&src=&offset="+str(i)
    while requests.get(url).json()['result'] is not None:
      url = "https://pi.pardot.com/api/Prospect/version/4/do/query? user_key=&api_key=&output=bulk&format=json&sort_by=&src=&offset="+str(i)
      data = pd.DataFrame.from_dict(requests.get(url).json()['result']['prospect'])
      final_data=data.append(final_data)
      i=i+200
    final_data.to_csv('complete_data.csv',index=False)
    

    我使用条件requests.get(url).json()['result'] is not None,因为我不知道存在的偏移数量。因此,我每次都检查该偏移量中是否存在记录。如果您有数千个偏移量,这可能需要很长时间。希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      提供修改后的可行解决方案

      我已避免使用“Offset”参数,因为建议不要将其用于批量数据拉取。

      """defining a function for getting an api key using credentials for Pardot user"""
      
      def api_key_gen():
          import requests
          import json
      
          url = "https://pi.pardot.com/api/login/version/3%20HTTP/1.1"
          
          querystring = {"email":"","password":"","user_key":"","format":"json"}
          
          headers = {
              'Connection': "keep-alive",
              'cache-control': "no-cache"
              }
          
          response = requests.request("POST", url, headers=headers, params=querystring)
          
      #    print(json.loads(response.text)['api_key'])
          return (json.loads(response.text)['api_key'])
      

      使用这两个函数来获取数据。

      1. 第一个函数在两个日期之间获取数据。
      2. 如果在一秒钟内存储了大量记录,则使用第二个函数。
      def fetchFromDate(api_key, max_date, target_date):
          url = "https://pi.pardot.com/api/prospect/version/3/do/query? user_key=&api_key="+str(api_key)+"&output=bulk&created_after="+str(max_date)+"&created_before="+str(target_date)+"&format=json"
          result = json.loads((requests.request("GET", url)).text)['result']['prospect']
          data = pd.DataFrame(result)
          return data
      
      def fetchFromId(api_key, max_id):
          url = "https://pi.pardot.com/api/prospect/version/3/do/query? user_key=&api_key="+str(api_key)+"&output=bulk&id_greater_than="+str(max_id)+"&format=json"
          result = json.loads((requests.request("GET", url)).text)['result']['prospect']
          data = pd.DataFrame(result)
          return data
      
      
      

      使用下面的代码从 pardot api 获取数据一个月以保持数据的大小。此外,每当 api 密钥过期时,都会获取一个新的密钥 api 密钥并在 URL 中使用。日期用于相互比较为了只获取所需时间段的数据。我试图让整个过程保持动态,除了日期参数。

      import pandas as pd
      import requests
      import json
      from datetime import datetime,timedelta
      
      """using a start date and target date to fetch data for a particular time span"""
      
      max_date = '2014-02-03 08:02:57'
      target_date = datetime.strptime('2014-06-30 23:59:59','%Y-%m-%d %H:%M:%S')
      
      
      final_data = pd.DataFrame() #Initialize an empty dataframe
      api_key = api_key_gen()
      last_maxDate = max_date
      last_maxId = '' #get the id of first record for desired year and fill here
      url = "https://pi.pardot.com/api/prospect/version/3/do/query? user_key=&api_key="+str(api_key)+"&output=bulk&created_after="+str(max_date)+"&created_before="+str(target_date)+"&format=json"
      print("Start Time : ",datetime.now())
      i =1
      while json.loads((requests.request("GET", url)).text)['result'] is not None:
      #    max_date = datetime.strptime(str(max_date),'%Y-%m-%d %H:%M:%S')-timedelta(seconds=1)
          last_maxDate = datetime.strptime(str(last_maxDate),'%Y-%m-%d %H:%M:%S')
          api_key = api_key_gen()
          data = fetchFromDate(api_key, max_date, target_date)
          if len(data) < 200:
              final_data=data.append(final_data,ignore_index=True)
              break
          else:
              max_id = max(data['id'])
              max_date = max(data['created_at'])
              max_date = datetime.strptime(str(max_date),'%Y-%m-%d %H:%M:%S')-timedelta(seconds=1)
      #        print(type(max_date),type(last_maxDate))
              if bool(max_date == last_maxDate) & bool(int(max_id) == int(last_maxId)):
                  print("Running through Id's")
                  api_key = api_key_gen()
                  data = fetchFromId(api_key, max_id)
      #            final_data=data.append(final_data,ignore_index=True)
                  max_id = max(data['id'])
                  max_date = max(data['created_at'])
              final_data=data.append(final_data,ignore_index=True)
              last_maxDate = max_date
              last_maxId = max_id
              print("Running Loop :",i,max_date,max_id)
              i += 1
      
      print(max(data['created_at']))
      print(max(data['id']))
      final_data.to_csv('file.csv',index=False)
      print("End Time : ",datetime.now())
      

      【讨论】:

        【解决方案3】:

        此外,Pardot API 密钥每 60 分钟过期一次。所以最好在python中使用PyPardot4,它可以在当前密钥过期时使用新的API密钥。

        您可以使用以下代码。

        from pypardot.client import PardotAPI
        import requests
        import pandas as pd
        p = PardotAPI(
            email='',
            password='',
            user_key='')
        p.authenticate()    
        i=0
        final_data = pd.DataFrame()
        while i <=p.prospects.query()['total_results'] -1: 
          print(i)
          data=pd.DataFrame.from_dict(p.prospects.query(format='json',sort_by='id',offset=i)['prospect'])
          final_data=data.append(final_data,sort=True)
          i=i+200
        final_data.to_csv('complete_data.csv',index=False)
        

        【讨论】:

          【解决方案4】:

          上面的答案很适合循环。如果您只需要有限数量的字段,请查看移动响应格式,它没有 200 条记录的限制。但是它只支持几个预定义的字段。

          【讨论】:

            【解决方案5】:

            您可以使用适用于 Prospect 表的 Export API。这可以给出一年的数据。所以逻辑上创建每年的查询。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-02-18
              • 2014-06-16
              • 1970-01-01
              相关资源
              最近更新 更多