def throttled_call(*args, **kwargs):
"""
Helper function for complying with rate limits.
:parameters: Same as requests.get
:returns: requests response object
:side effects: updates global rate_limit count and expires values
"""
# Declare rate_limit as global so we can write to it
global rate_limit
# Try as long as we need to succeed
while True:
# Take a break if there are less than 4 calls in the current rate limit timeslot
now = datetime.datetime.utcnow()
if rate_limit['calls'] < 5 and rate_limit['expires'] > now:
wait_for_limit()
try:
result = auth.get(*args, **kwargs)
# Update remaining calls and expiry date with the new number from twitter
rate_limit['calls'] = int(result.headers.get('x-rate-limit-remaining', 0))
if 'x-rate-limit-reset' in result.headers:
rate_limit['expires'] = datetime.datetime.utcfromtimestamp(int(result.headers['x-rate-limit-reset']))
return result
# Catch these two errors and continue
# It is generally a good idea to only catch errors that you anticipate
# Unknown Exceptions should be allowed to occur so you learn about them!
except (ReadTimeout, ConnectTimeout):
logging.error("There was a network timeout, retrying!")
finally:
# Wait for one second, regardless of our success.
# Waiting one second between requests is a generally accepted sane default
time.sleep(1)
# -----------------------
# DATA FETCHING FUNCTIONS
# -----------------------
评论列表
文章目录