我正在尝试使用标准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)
感谢您的帮助。
正如我在your Tweepy issue on GitHub中回答的那样,“混合” result_type
包括热门结果和近期结果。如果您只想要最新结果,则需要指定“最近”。正如我还解释的那样,您将需要使用since_id
参数来避免获得重复的推文。
请参见the documentation for API.search
和API.search
。
如果要在2秒(而不是一个小时)之类的较短时间范围内对分页结果进行迭代,则可以使用the standard search API。
至于每个查询有100多个结果,标准搜索API的限制是每页最多100个,因此这是不可能的。
[也许有可能使用网络抓取从公共帐户从Twitter获取数据,但是您需要先检查法律要求。