使用Zendesk API和Python获取大型数据集亚博
一个简单的脚本,就像您可以在basic Python教程中编写的脚本一样向票务API发出请求可以从Zendesk产品中获取多达24条左右的记录。亚博然而,要检索几百或几千条记录,脚本必须执行以下任务:
本文向您展示了如何编写一个Python脚本,该脚本可以使用Zendesk API检索大型数据集。亚博要运行这些示例,您需要Python 3和请求图书馆。
从API获得大型数据集后,您可能希望将其移动到Microsoft Excel工作表中,以便更轻松地查看和分析数据。想知道怎么做,请看用Python和pandas编写大型数据集到Excel。
对于可以从Zendesk产品检索到的所有可能的数据,请参阅亚博支持和帮助中心API文档。大多数api都有一个“List”端点来获取多个记录。
免责声明Ze亚博ndesk提供本文仅用于指导目的。亚博Zendesk不支持或保证代码。亚博Zendesk也不能为Python等第三方技术提供支持。
提出基本要求
假设您想在帮助中心下载某个社区主题中的4000篇文章。从基本的请求开始。创建一个名为list_posts.py并粘贴以下代码:
进口请求
凭证=“your_亚博zendesk_email”,“your_亚博zendesk_password”
会话=请求。会话()
会话。身份验证=凭证
亚博=“your_亚博zendesk_url”
topic_id=123456
url=f '{亚博}/ / api / v2 /社区/主题{topic_id}/ posts.json '
响应=会话。得到(url)
如果响应。status_code! =200:
打印(状态码错误{响应。status_code}')
退出()
数据=响应。json()
topic_posts。扩展(数据[“文章”])
为帖子在topic_posts:
打印(帖子[“标题”])
中解释了脚本的一般逻辑从Zendesk产品获取数据亚博在Python基础教程中。
替换占位符your_亚博zendesk_email,your_亚博zendesk_password,your_亚博zendesk_url用你自己的价值观。Zend亚博esk支持URL应该是这样的https://
保存文件。在命令行工具中,导航到脚本所在的文件夹,并运行以下命令:
python3 list_posts.py
响应应该返回您指定的社区主题中的前30个帖子。
对所有结果进行分页
由于带宽的原因,API不会一次返回大量的记录集。使用页面(大小)
参数中指定每页要返回的项数。大多数端点将此限制为最多100个。
要捕获所有记录,请创建一个while循环,将页面数据增量地存储在一个变量中,并继续分页,直到has_more
属性嵌套在元
JSON对象为false。这表明没有进一步的记录。将突出显示的行添加到脚本中,这样做:
进口请求
凭证=“your_亚博zendesk_email”,“your_亚博zendesk_password”
会话=请求。会话()
会话。身份验证=凭证
亚博=“your_亚博zendesk_url”
topic_id=123456
topic_posts=[]
url=f '{亚博}/ / api / v2 /社区/主题{topic_id}/ posts.json吗?页面(大小)=100'
而url:
响应=会话。得到(url)
如果响应。status_code! =200:
打印(状态码错误{响应。status_code}')
退出()
数据=响应。json()
topic_posts。扩展(数据[“文章”])
如果数据[“元”][“has_more”]:
url=数据[“链接”][“下一个”]
其他的:
url=没有一个
为帖子在topic_posts:
打印(帖子[“标题”])
有关逻辑的解释,请参见使用游标分页对列表进行分页。
谨防速率限制
如果您在短时间内发出大量API请求,例如在对大型数据集进行分页时,您可能会碰到Zendesk API速率限制。亚博API将停止处理任何请求,直到经过一定的时间。有关更多信息,请参见使用限制在API参考文档中。
当达到速率限制时,API将使用HTTP进行响应请求太多响应代码。响应有一个Retry-After
头,它告诉您在重试之前需要等待多少秒。
使用突出显示的行更新脚本以检查429状态码并等待,如果检测到:
进口时间
进口请求
凭证=“your_亚博zendesk_email”,“your_亚博zendesk_password”
会话=请求。会话()
会话。身份验证=凭证
亚博=“your_亚博zendesk_url”
topic_id=123456
topic_posts=[]
url=f '{亚博}/ / api / v2 /社区/主题{topic_id}/ posts.json吗?页面(大小)=100'
而url:
响应=会话。得到(url)
如果响应。status_code= =429:
打印(“速度有限!请稍等。”)
时间。睡眠(int(响应。头[“retry-after”]))
继续
如果响应。status_code! =200:
打印(状态码错误{响应。status_code}')
退出()
数据=响应。json()
topic_posts。扩展(数据[“文章”])
如果数据[“元”][“has_more”]:
url=数据[“链接”][“下一个”]
其他的:
url=没有一个
为帖子在topic_posts:
打印(帖子[“标题”])
有关更多信息,请参见避免速率限制的最佳实践。
侧载相关数据
假设您希望显示每个社区帖子的作者。post API返回的记录仅通过Zendesk Support用户id来标识作者,而不是通过他们的实际姓名。亚博例子:“author_id”:21436587
。
您可以调用用户API来获取与每个用户id相关联的名称。但是,这意味着要为数据集中的每个帖子调用API,这可能会导致数千次API调用。
一个更有效的解决办法是拷贝的用户记录与发帖记录相同。旁路加载在单个请求中获取两个记录集。有关更多信息,请参见加载相关记录。
按照如下方式更新脚本(突出显示新行),以加载撰写帖子的用户。请确保水平滚动以查看修改后的内容url
变量。
进口时间
进口请求
凭证=“your_亚博zendesk_email”,“your_亚博zendesk_password”
会话=请求。会话()
会话。身份验证=凭证
亚博=“your_亚博zendesk_url”
topic_id=123456
topic_posts=[]
user_list=[]
url=f '{亚博}/ / api / v2 /社区/主题{topic_id}/ posts.json吗?页面(大小)=100&include=users'
而url:
响应=会话。得到(url)
如果响应。status_code= =429:
打印(“速度有限!请稍等。”)
时间。睡眠(int(响应。头[“retry-after”]))
继续
如果响应。status_code! =200:
打印(状态码错误{响应。status_code}')
退出()
数据=响应。json()
topic_posts。扩展(数据[“文章”])
user_list。扩展(数据[“用户”])
如果数据[“元”][“has_more”]:
url=数据[“链接”][“下一个”]
其他的:
url=没有一个
为帖子在topic_posts:
作者=“匿名”
为用户在user_list:
如果用户[“id”]= =帖子[“author_id”]:
作者=用户[“名字”]
打破
打印(f \”{帖子[“标题”]}\”,{作者}')
对于每个帖子,脚本循环遍历用户记录列表寻找匹配项author_id价值。找到匹配项后,脚本将关联的用户名分配给作者变量并跳出循环。然后将作者的姓名与帖子标题一起打印出来。
序列化数据以重用它
假设您正在开发脚本,并且需要发出重复的API请求来测试和调试它。当您处理需要数百甚至数千个请求来获取所有数据的大型数据集时,这是一种浪费。相反,你只需打一个电话,序列化结果,然后根据需要多次重用序列化的数据。
序列化数据结构意味着将其转换为可以存储的格式,然后在同一环境中进行重建。对于Zendesk API返回的数据,JSON是一个不错的选择。亚博它还有一个额外的好处,就是易于阅读。在Python中,您可以使用内置的json模块序列化和反序列化一个数据结构。
用突出显示的行更新脚本以序列化所有的post和user数据:
进口json
进口时间
进口请求
凭证=“your_亚博zendesk_email”,“your_亚博zendesk_password”
会话=请求。会话()
会话。身份验证=凭证
亚博=“your_亚博zendesk_url”
topic_id=123456
topic_posts=[]
user_list=[]
url=f '{亚博}/ / api / v2 /社区/主题{topic_id}/ posts.json吗?页面(大小)=100&include=users'
而url:
响应=会话。得到(url)
如果响应。status_code= =429:
打印(“速度有限!请稍等。”)
时间。睡眠(int(响应。头[“retry-after”]))
继续
如果响应。status_code! =200:
打印(状态码错误{响应。status_code}')
退出()
数据=响应。json()
topic_posts。扩展(数据[“文章”])
user_list。扩展(数据[“用户”])
如果数据[“元”][“has_more”]:
url=数据[“链接”][“下一个”]
其他的:
url=没有一个
topic_data={“文章”:topic_posts,“用户”:user_list}
与开放(“my_serialized_data_file.json”,模式=' w ',编码=“utf - 8”)作为f:
json。转储(topic_data,f,sort_keys=真正的,缩进=2)
该脚本将用户和post数据分配给名为主题,然后将其序列化为一个名为my_serialized_data_file.json在当前文件夹中。
然后你可以注释掉剩下的代码,并根据你想要测试和格式化输出的次数对字典进行反序列化:
进口json
#注释掉其他所有内容
与开放(“my_serialized_data_file.json”,模式=“r”)作为f:
主题=json。负载(f)
为帖子在主题[“文章”]:
作者=“匿名”
为用户在主题[“用户”]:
如果用户[“id”]= =帖子[“author_id”]:
作者=用户[“名字”]
打破
打印(f \”{帖子[“标题”]}\”,{作者}')
您可以使用相同的代码片段来开发其他脚本,而无需调用API。
现在您有了更新Python脚本的工具,可以使用API检索大型数据集。如果要将数据移至Microsoft Excel以查看和分析,请参见使用游标分页对列表进行分页。
代码完成
进口json
进口时间
进口请求
凭证=“your_亚博zendesk_email”,“your_亚博zendesk_password”
会话=请求。会话()
会话。身份验证=凭证
亚博=“your_亚博zendesk_url”
topic_id=123456
topic_posts=[]
user_list=[]
url=f '{亚博}/ / api / v2 /社区/主题{topic_id}/ posts.json吗?页面(大小)=100&include=users'
而url:
响应=会话。得到(url)
如果响应。status_code= =429:
打印(“速度有限!请稍等。”)
时间。睡眠(int(响应。头[“retry-after”]))
继续
如果响应。status_code! =200:
打印(状态码错误{响应。status_code}')
退出()
数据=响应。json()
topic_posts。扩展(数据[“文章”])
user_list。扩展(数据[“用户”])
如果数据[“元”][“has_more”]:
url=数据[“链接”][“下一个”]
其他的:
url=没有一个
topic_data={“文章”:topic_posts,“用户”:user_list}
与开放(“my_serialized_data_file.json”,模式=' w ',编码=“utf - 8”)作为f:
json。转储(topic_data,f,sort_keys=真正的,缩进=2)
与开放(“my_serialized_data_file.json”,模式=“r”)作为f:
主题=json。负载(f)
为帖子在主题[“文章”]:
作者=“匿名”
为用户在主题[“用户”]:
如果用户[“id”]= =帖子[“author_id”]:
作者=用户[“名字”]
打破
打印(f \”{帖子[“标题”]}\”,{作者}')