Pardot API从Prospect表中检索所有记录

时间:2018-08-22 12:42:57

标签: talend pardot

我正在使用Talend向Pardot发出API调用,并从Prospect表中检索记录。 这给了我200条记录。 任何人都可以提出一种检索该表中所有可用记录的方法。

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

4 个答案:

答案 0 :(得分: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是因为我对存在的偏移量数量一无所知。因此,我每次都要检查该偏移量中是否存在记录。如果您有数千个偏移量,这可能会花费太长时间。希望这会有所帮助。

答案 1 :(得分:0)

此外,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)

答案 2 :(得分:0)

提供经过修改的有效解决方案

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

"""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中使用。日期用于相互比较为了只获取所需时间段的数据。我尝试使整个过程保持动态,除了dates参数。

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 :(得分:0)

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