이 글은 트위터 데이터를 얻기 위한 나의 노력을 적어둔 것이다.(며칠동안의 고민과 노력이 아까워서...)
결론부터 이야기 하자면 "트위터 데이터는 더이상 무료로 얻을 수 없다."
예전 논문 리뷰 2에서 트위터 데이터를 다룬 논문을 리뷰한 적이 있다.
그때 블로그에는 추후 트위터 데이터로 시도를 해볼 것이라고만 적어두었는데
사실 트위터 데이터로 이미 해보았다.
그때 결과가 매우 좋지 못해서 코드를 올리지 못했었다.
Date = pd.date_range(start='20160630', end='20200701')
Date = Date.strftime('%Y-%m').unique()
Date = list(Date)
def tweet_collect(Date):
query = "AAPL"
start_day = Date + "-01"
end_day = datetime.strptime(start_day,'%Y-%m-%d')+relativedelta(days=1)
end_day = end_day.strftime('%Y-%m-%d')
tweet_list = []
for tweet in sntwitter.TwitterSearchScraper(query + " since:" + start_day + " until:" + end_day).get_items():
if(tweet.retweetCount >= 5 and tweet.likeCount >= 10):
tweet_list.append([tweet.date, tweet.rawContent, tweet.retweetCount, tweet.likeCount])
return tweet_list
def work_func(Date):
tweet = list(map(tweet_collect, Date))
return tweet
def main():
num_cores = 28
Date_split = np.array_split(Date,num_cores)
pool = Pool(num_cores)
tweet = pool.map(work_func, Date_split)
pool.close()
pool.join()
return tweet
if __name__ == "__main__":
start = datetime.now()
tweet = main()
print(datetime.now()-start)
tweets = []
for i in range(len(tweet)):
for j in range(len(tweet[i])):
tweets = tweets + tweet[i][j]
tweets_text = [tweets[i][1].replace("\n"," ") for i in range(len(tweets))]
tweets_text = list(map((lambda x: re.sub(r"[^!\"#$%&\'()*+,-./0-9:;<=>?@A-Z[\]^_`a-z{|}~]"," ",x)), tweets_text))
# hyperlink 제거
def remove_link(lst):
pattern = re.compile("^https://+")
remove_lst = list(map((lambda x: "" if pattern.search(x) else x), lst.split()))
remove_lst = list(filter(None, remove_lst))
remove_lst = ' '.join(remove_lst)
return remove_lst
tweets_text = list(map(remove_link, tweets_text))
이렇게 데이터를 정리했고 그 후로 구두점 제거, 토큰화, 불용어 제거 등을 한 후 결과를 내었다.
그땐 트위터 데이터를 이용해 얻은 결과가 좋지 못했고 그대로 마무리를 했었다.
그 후, 내가 재현한 논문의 결과들을 정리하기 위해 전체 코드를 돌려본 적이 있었다. 그때 위 코드도 다시 실행해보았었다.
하지만 처음 잘 돌아갔던 때와는 달리 갑자기 403 ERROR을 띄우며 코드가 실행되지 않았다.
이것저것 시도해보았지만 결국 실패했고 보류한 후 연구를 이어갔었다.
그리고 며칠 전, NBC, NYT 데이터와 함께 트위터 데이터를 같이 사용해 감성분석을 하고 비교를 해보고 싶어 다시 코드를 돌려보았다.
하지만 여전히 돌아가지 않았다.
이게 어떻게 된걸까?
구글링을 열심히 해보니 더이상 sntwitter 패키지를 제공하지 않는다는 것이었다.
트위터 회사에서 막아버렸다는 것이다.
전에 참고한 논문들의 재현성을 보기위해서 데이터를 수집해본 적이 있었다.
그때 트위터 API 사용 허가를 받고 API 앱도 만들고 토큰도 발급받아뒀었다.
그래서 트위터 API를 다시 시도해보았다.
처음엔 twitter 패키지를 사용했다.
api = twitter.Api(consumer_key="",
consumer_secret="",
access_token_key="",
access_token_secret="")
query = "DJI"
GS = api.GetSearch(term=query, count=100)
시도했지만 GetSearch라는 함수는 없다고 한다.
!pip install twitter도 해보고 !pip install python-twitter 도 해보았지만 소득은 없었다.
구글링을 해보니 예전 게시글에서만 사용하는 함수였다. 아마도 지원을 하지 않거나 변경을 한 것 같았다.
두번째로 tweepy 패키지를 사용했다.
import tweepy
api_key = ""
api_secret = ""
access_key = ""
access_secret = ""
auth = tweepy.OAuthHandler(api_key, api_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth, wait_on_rate_limit=True)
# 1번째
query = "DJI"
search = api.search_tweets(q=query)
# 2번째
query = "DJI"
cursor = tweepy.Cursor(api.search_tweets, q= query, lang="en", tweet_mode="extended").items(100)
tweets = [tweet.full_text for tweet in cursor]
첫번째 방법으로도 시도했고 https://twittercommunity.com/t/tweepy-errors-forbidden-403-forbidden/162265 이 링크를 참고해 2번째 코드도 실행을 해보았지만 실패했다.
그래서 https://github.com/tweepy/tweepy/blob/master/examples/API_v2/search_recent_tweets.py 이 링크에 있는 코드로 실행도 해보았지만 또 실패했다.
결국 트위터 API 페이지를 열심히 살펴보았고, https://github.com/twitterdev/Twitter-API-v2-sample-code/blob/main/Recent-Search/recent_search.py 이 페이지를 발견했고 여기에 있는 코드도 실행해보았지만 실패했다.
문제점을 계속 찾다가 https://hobbylists.tistory.com/entry/%ED%8A%B8%EC%9C%84%ED%84%B0-API-V2-%EC%82%AC%EC%9A%A9%EB%B2%95-%ED%8A%B8%EC%9C%84%ED%84%B0-API-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EC%98%A4%EB%A5%98-%EA%B4%80%EB%A0%A8 이 해결방법을 찾았다.
열심히 찾고 시도해보았지만 실패했다. 근데 이상한 점이 있었다.
위 페이지의 내용과 나의 개발자 계정 내용이 다른 것이었다.
다시 구글링을 하고 홈페이지를 살펴보았는데 나는 하나만 무료인데 위 페이지는 무료가 꽤 많았다.
처음엔 내가 무료 버전을 못찾았거니 했고, 당장 제공하는 무료버전이 있으니 당연히 사용할 수 있을 거라고 생각했다..
하지만 구글링 도중 뉴스를 발견하게 되었고, 뉴스에 나온 내용은 트위터 API를 "전면" 유료화했다는 것이었다.
조금 더 찾아보니 현재 무료로는 얻을 수 없고, 아직 API가 완벽히 개선되지 않았다는 것이다.
홈페이지를 찾아볼 때 들어가지지 않는 페이지와 개선 중인 페이지가 꽤 보였는데 이 탓이었을까...
2023년 3월 이후로 구글 검색 기간을 제한하고 검색을 해보니 그 이후 트위터 API를 사용한 사람도 질문도 없었다.
정보를 더 얻을 수도 없고, 레딧과 트위터 둘다 전면 유료화가 되었다고 하니 무료로 데이터를 얻을 수 있는 방법은 없다.
사용료를 지불하거나 트위터 데이터를 포기하는 쪽으로 방향을 정해야겠다.
'논문 > Code' 카테고리의 다른 글
BERT (2) (0) | 2023.05.24 |
---|---|
Bert (1) (0) | 2023.05.07 |
Collect New york times news headlines using r (0) | 2023.02.01 |
news data preprocessing code modification (0) | 2023.01.15 |