在python中通过twitter趋势数据循环

时间:2014-04-26 17:41:03

标签: python loops twitter tweepy

我有一个连接到Twitter API的bot脚本(使用tweepy库),获取atm趋势主题标签数据并编写一条以该列表中的主题标签结尾的推文。它通过不超过120个字符的行读取文本,但有时会发生顶部趋势标签长度超过20个字符,这会导致推文超过140个字符的twitter限制并且会破坏脚本运行。

所以我想写一个嵌套的循环,会说这样的话:

get twitter trends data
if the top hashtag is longer than 120 characters
then check the second one
and if even the second one is longer than 120 characters
wait for 15 min and check again
tweet when you find a hashtag than is smaller or same as 20 characters 

我尝试了这个,但它没有工作:

for line in f:
    trends1 = api.trends_place(1)
    # print trends1
    hashtags = [x['name'] for x in trends1[0]['trends'] if x['name'].startswith('#')]
    # print hashtags
    print hashtags[0]
    if len(hashtags[0]) <= 20:
        trend_hashtag = hashtags[0]
        api.update_status(line + trend_hashtag)
    elif len(hashtags[0]) > 20:
        trend_hashtag = hastags[1]
        api.update_status(line + trend_hashtag)
    elif len(hashtags[1]) > 20:
        time.sleep(900)
    time.sleep(10800)

我刚开始学习python,我做错了什么,你能帮助我吗?

连接到twitter api并在列表中获取趋势标签工作正常,问题出在所描述的循环中。谢谢!

1 个答案:

答案 0 :(得分:1)

您的第一个elif似乎与您在问题顶部描述的规范不符。

if语句检查第一个#标签是否≤20个字符。如果是这样,那就推文;如果没有,它没有。到现在为止还挺好。然后,您的第一个elif语句保证执行 - 因为如果len(hashtags[0])不是<= 20,那么肯定是> 20,所以你永远不会到达第二个elif。如果您想检查第二个#标签是否超过20个字符,那么您的第一个elif应如下所示:

elif len(hashtag[1]) <= 20:
    trend_hashtag = hashtags[1] # you have a typo here btw
    api.update_status(line + trend_hashtag)

最后,您的上一个elif应该只是else。如果你希望它在推文之间睡3个小时,你应该在每次推文后调用time.sleep(10800)。总而言之,您的代码应该看起来更像这样:

for line in f:
    trends1 = api.trends_place(1)
    hashtags = [x['name'] for x in trends1[0]['trends'] if x['name'].startswith('#')]
    trend_hashtag = None
    if len(hashtags[0]) <= 20:
        trend_hashtag = hashtags[0]
    elif len(hashtags[1]) <= 20:
        trend_hashtag = hashtags[1]
    if trend_hashtag:
        api.update_status(line + trend_hashtag)
        time.sleep(3*60*60)
    else:
        time.sleep(15*60)

这样,你在发推文后只做了3个小时的睡眠 - 否则(如果你没有发过推文),你只能睡15分钟,然后再试一次。