Cursor教程
此教程详细阐述了如何用Cursor对象进行与分页有关的操作。
简介
分页在 Twitter API 的开发中有着广泛的运用,如对时间线,用户列表,私信的迭代等等。为了实现分页的操作,我们必须为每一个request提供一个页面/指针(page/cursor)参数。但是单为了处理分页的循环实际上就需要很多样板代码(boiler plate code),所以Tweepy中Cursor对象的出现就是为了让分页操作更简单,代码更高效。
传统方法 vs Cursor方法
首先我们来解释一下如何迭代授权用户的时间线。下面是在Cursor对象引入前的老办法:
page = 1
while True:
statuses = api.user_timeline(page=page)
if statuses:
for status in statuses:
# process status here
process_status(status)
else:
# All done
break
page += 1 # next page
正如代码中所写,我们必须手动在分析分页的循环中处理 ‘页码’ 参数。现在我们再给出使用Cursor对象的版本:
for status in tweepy.Cursor(api.user_timeline).items():
# process status here
process_status(status)
现在代码是不是看起来好多了?Cursor在后台处理了所有有关分页的操作,所以我们需要关心对分页有什么具体的处理就可以了。
向API方法中传递参数
如果我们想往API方法中传递参数该怎么做呢?
api.user_timeline(id="twitter")
由于我们是把API方法当做Cursor的参数进行传递,所以方法本身的参数就不能像调用方法时那样传送。取而代之的是将其作为Cursor的参数进行传递:
tweepy.Cursor(api.user_timeline, id="twitter")
现在,当发送请求时,Cursor会把参数传递到方法中了。
Items 和 Pages
到目前为止我们只说明了如何对item进行迭代,那么如果要直接处理每张分页的结果该怎么做呢?答案是用pages()方法:
for page in tweepy.Cursor(api.user_timeline).pages():
# page is a list of statuses
process_page(page)
限制
如果我们只想要前n个item或分页该怎么做呢?方法很简单,就是将数量上限作为参数传递到items()或pages()方法中。
# Only iterate through the first 200 statuses
for status in tweepy.Cursor(api.user_timeline).items(200):
process_status(status)
# Only iterate through the first 3 pages
for page in tweepy.Cursor(api.user_timeline).pages(3):
process_page(page)