Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exclude Retweets and Replies when getting Tweets from user timeline - Tweepy

I use the following code for downloading Tweets from user timeline with Tweepy. However, this returns Tweets including Retweets and Replies by the user also. I want only the Tweets posted in user's own timeline. How can I filter this results?

The reason is I want to collect Tweets posted by cosmetics companies about their products. Tweets in their timeline give me this. However, Replies and Retweets looks likes regular conversations, do not talk about products. I want to filter these out.

import tweepy
import csv
import time

# Twitter API credentials
consumer_key = "xxxxxxx"
consumer_secret = "xxxxx"
access_key = "xxxxxxx"
access_secret = "xxxx"

def get_all_tweets(screen_name):
    # Twitter only allows access to a users most recent 3240 tweets with this method

    # authorize twitter, initialize tweepy
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    api = tweepy.API(auth)

    # initialize a list to hold all the tweepy Tweets
    alltweets = []

    # make initial request for most recent tweets (200 is the maximum allowed count)
    new_tweets = api.user_timeline(screen_name=screen_name, count=200)

    # save most recent tweets
    alltweets.extend(new_tweets)

    # save the id of the oldest tweet less one
    oldest = alltweets[-1].id - 1

    # keep grabbing tweets until there are no tweets left to grab
    while len(new_tweets) > 0:
        print
        "getting tweets before %s" % (oldest)

        # all subsiquent requests use the max_id param to prevent duplicates
        new_tweets = api.user_timeline(screen_name=screen_name, count=200, max_id=oldest, include_entities=True)

        # save most recent tweets
        alltweets.extend(new_tweets)

        # update the id of the oldest tweet less one
        oldest = alltweets[-1].id - 1

        print
        "...%s tweets downloaded so far" % (len(alltweets))

    user = api.get_user(screen_name)
    followers_count = user.followers_count


    # transform the tweepy tweets into a 2D array that will populate the csv
    outtweets = [[tweet.id_str, tweet.created_at, tweet.text.encode("utf-8"), 1 if 'media' in tweet.entities else 0,
                  1 if tweet.entities.get('hashtags') else 0, followers_count, tweet.retweet_count, tweet.favorite_count]
                 for tweet in alltweets]


    # write the csv
    with open('tweets.csv', mode='a', encoding='utf-8') as f:
        writer = csv.writer(f)
        #writer.writerow(["id", "created_at", "text", "hasMedia", "hasHashtag", "followers_count", "retweet_count", "favourite_count"])
        writer.writerows(outtweets)

    pass

def main():
    get_all_tweets("@MACcosmetics")


if __name__ == '__main__':
    main()
like image 337
Kabilesh Avatar asked Sep 16 '25 16:09

Kabilesh


1 Answers

Unfortunately tweepy does not have this: But instead you can use python-twitter

this has a method

def GetHomeTimeline(self,
                        count=None,
                        since_id=None,
                        max_id=None,
                        trim_user=False,
                        exclude_replies=False,
                        contributor_details=False,
                        include_entities=True):

and should work well in your case

like image 181
Amrit Avatar answered Sep 19 '25 06:09

Amrit