首页 > 解决方案 > 如何使用 Twitter 的标准 API 每天每次查询获得超过 100 条不同的记录?

问题描述

我正在尝试使用标准 API 下载推文列表,但我得到的总是相同的记录。即,这是我的要求:

ApiSearch = api.search(q="#immigration", lang="en", result_type="mixed", count=100, until=untilDate, include_entities=False)

但是如果我不时地在 1 小时之间运行它,我得到的结果是一样的。

我的设置有问题api.search还是我误解了 Twitter 标准 API 的限制?

这是我的代码:

conn_str = ("DRIVER={PostgreSQL Unicode};"
    "DATABASE=TwitterLCL;"
    "UID=postgres;"
    "PWD=pswd;"
    "SERVER=localhost;"
    "PORT=5432;")

consumer_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
consumer_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
access_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
access_token_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth, wait_on_rate_limit=True)

col_db_tweetTable01 =  ['CREATED_AT', 'TWEET_ID', 'TEXT', 'USER_ID']

i = 0
while i <= 10000:
    time.sleep(2)
    i += 1
    ApiSearch = api.search(q="#immigration", lang="en", result_type="mixed", count=100, until=None, include_entities=False)
    time.sleep(2)
    for res in range(0, len(ApiSearch)):
        db_tweetTable01DB = pd.DataFrame(columns = col_db_tweetTable01) #creates a new dataframe that's empty
        TWEET = ApiSearch[res]._json
        Created_At = None
        Created_At = TWEET.get("created_at")
        print("Created_At : "+Created_At)
        Tweet_Id = None
        Tweet_Id = TWEET.get("id_str")
        Text = None
        Text = TWEET.get("text")
        User_Id = TWEET.get("user").get("id_str")
        db_tweetTable01DB = db_tweetTable01DB.append({'CREATED_AT' : Created_At, 'TWEET_ID' : Tweet_Id, 'TEXT' : Text, 'USER_ID' : User_Id}, ignore_index=True)
        try:
            connStr = pyodbc.connect(conn_str)
            cursor = connStr.cursor()
            for index, row in db_tweetTable01DB.iterrows():
                #print(row)
                cursor.execute("INSERT INTO public.db_tweettable01(CREATED_AT, TWEET_ID, TEXT, USER_ID) values (?, ?, ?, ?)", row['CREATED_AT'], row['TWEET_ID'], row['TEXT'], row['USER_ID'])
                connStr.commit()
            cursor.close()
            connStr.close()
        except pyodbc.Error as ex:
            sqlstate = ex.args[1]
            print(sqlstate)
            print("Tweet_Id : "+Tweet_Id)
            print("User_Id : "+User_Id)

谢谢你的帮助。

标签: pythontwittertweepy

解决方案


正如我在 GitHub 上的 Tweepy 问题中回答的那样,“混合”result_type包括流行的和最近的结果。如果您只想要最近的结果,则需要指定“最近的”。正如我还解释过的,您需要使用该since_id参数来避免获得重复的推文。

请参阅标准搜索 API文档API.search

如果您要在 2 秒而不是 1 小时的短时间内迭代分页结果,则可以使用Cursor代替。

对于每个查询超过 100 个结果,标准搜索 API 的限制是每页最多 100 个,所以这是不可能的。


推荐阅读