파이썬과 트위터 API를 활용한 트위터 크롤링 (코드 예제)

트위터는 본인들의 서비스가 널리 활용될 수 있도록 개발자나 기업이 사용 가능한 형태의 API를 제공하고 있다. (트위터 API 소개)

그런데 이 API 서비스에도 일종의 종류가 있다. 물론 무료로도 기본적인 기능을 충분히 활용할 수 있으나 돈을 내면 Premium, Enterprise 등 더 강력한 옵션을 적용할 수 있고, 트위터 광고주들은 Ads API를 사용할 수도 있다. (참고 : https://developer.twitter.com/en/products/products-overview)

본 포스팅에서는 파이썬을 활용해서, 트위터 API를 사용하는 방법을 쉽게 정리해봤다.


준비

1. 개발자 신청

우선 트위터 API를 사용하려면 트위터 개발자 사이트에서 등록을 해야 된다. 자세한 내용은 아래 포스팅 참고.

이렇게 신청을 완료해서 발급받은 키와 토큰은 저장해서 고이 모셔두자.

2. 필요한 라이브러리 설치

파이썬으로 API를 다루기 위해서는 라이브러리를 설치해야 한다.

Premium, Enterprise 가입자를 위해 트위터에서 공식으로 제공하는 라이브러리도 있지만, 그건 제외하고.

오픈소스 라이브러리로는 아래와 같은 것들이 있다.

이건 모두 파이썬 공식 홈페이지에서 소개한 라이브러리들이다.

난 가장 위에 있는 python-twitter를 사용해보기로 했다. 우선 설치는 아래와 같이, 늘 그랬듯.

pip install python-twitter

이제 준비는 끝.


파이썬 코드 예제

우선 라이브러리를 불어오고

twitter_consumer_key = ""
twitter_consumer_secret = ""  
twitter_access_token = ""
twitter_access_secret = ""

import twitter

twitter_api = twitter.Api(consumer_key=twitter_consumer_key,
                          consumer_secret=twitter_consumer_secret, 
                          access_token_key=twitter_access_token, 
                          access_token_secret=twitter_access_secret)

1. 특정 계정의 타임라인 긁어오기 GetUserTimeline()

계정을 지정해서 그 계정의 타임라인을 긁어오자.

account = "@TheBlueHouseKR"
statuses = twitter_api.GetUserTimeline(screen_name=account, count=200, include_rts=True, exclude_replies=False)
print(statuses)

이때 최대로 가져올 수 있는 개수, 리트윗이나 답글을 포함할 것인지 여부 등을 지정할 수 있다.

그런데 막상 가져와서 출력해보면 다른 메타데이터들이 함께 들어 있을 거다. 언제 만들어졌고, 해시태그는 뭐가 있고, 미디어는 어떤 게 첨부되어 있고, 언어는 뭐고, 뭐 이런 것들.

만약 실제 트윗 텍스트만 보고 싶다면 이렇게 text만 따로.

for status in statuses:
    print(status.text)
#     print(status.text.encode('utf-8'))

여기서 가져온 텍스트는 유니코드이기 때문에, 혹시 텍스트가 깨질 경우 인코딩해서 보면 된다.

그리고 분석을 위해 이렇게 따로 텍스트 파일(json형식)으로 저장해볼 수 있겠다.

output_file_name = "twitter_get_timeline_result.txt"

with open(output_file_name, "w", encoding="utf-8") as output_file:
    for status in statuses:
        print(status, file=output_file)

2. 검색하기 GetSearch()

특정 검색어로 트윗들을 긁어올 수도 있다.

예를 들어 요즘 유행 중인 “코로나”로 검색한다고 하면 이렇게.

query = "코로나"
statuses = twitter_api.GetSearch(term=query, count=100)

for status in statuses:
    print(status.text)

물론 검색어 문자열로 해시태를 넣어도 된다.

이번에는 n번방 사건 관련한 트윗도 많이 올라오니 “#nthroom”이라는 해시태그로 검색을 하고, 이것과 함께 쓰인 다른 해시태그들을 출력해보자. 보통 트윗 하나에 해시태그를 여러개 다는 경우도 있으니까.

query = "#nthroom"
statuses = twitter_api.GetSearch(term=query, count=100)

for status in statuses:
    for tag in status.hashtags:
        print(tag.text)

status 안에 있는 hashtags를 찾아서 그 text를 출력해주면 된다.

그런데 이렇게 보면 정신 없으니까 파이썬 Counter()를 활용해서 가장 많이 등장한 해시태그 순으로 출력해보자.

from collections import Counter

query = "#nthroom"
statuses = twitter_api.GetSearch(term=query, count=100)

result = []

for status in statuses:
    for tag in status.hashtags:
        result.append(tag.text)
        
Counter(result).most_common(20)
[('Nthroom', 54),
 ('nthroom', 42),
 ('nthroomstop', 42),
 ('nthroomecrime', 29),
 ('Nthroom_stop', 20),
 ('nthroom_crime', 11),
 ('NthRoomCase', 11),
 ('nthroomcrime', 9),
 ('nthroomecrime_out', 8),
 ('N번방가입교사_교직아웃', 8),
 ('nthroom_stop', 7),
 ('SAYNOTO_NTHROOM', 7),
 ('N번방은_판결을_먹고_자랐다', 6),
 ('NoMoreNthRoom', 5),
 ('stop_the_nthroom', 3),
 ('NOMORE_NTHROOM', 3),
 ('残虐AV反対', 3),
 ('SAYNO_Nthroom', 3),
 ('saynotonthroom', 3),
 ('nthroomcrime_out', 3)]
​

비슷한 해시태그가 많다. 그리고 Nthroom과 nthroom이 따로 수집된 걸 보니 대소문자는 구분하는 걸로 보인다.

사실 이 정도의 실습은 그냥 재미 수준이다. 검색할 수 있는 트윗의 최대 숫자 같은 게 제한이 걸려 있다. (솔직히 귀찮아서 더 자세히 찾아보진 않았다.)

이보다 더 중요한 건 이제부터 소개할 스트리밍이다.

3. 스트리밍 GetStreamFilter()

특정 키워드를 지정해놓으면, 그 키워드가 포함된 트윗을 “실시간”으로 수집하는 거다.

이걸 크롤링이라고 부르는 사람들도 있던데, 사실 엄밀히 말하자면 스트리밍은 크롤링과 좀 다른 개념이긴 하다. 크롤링처럼 기존에 있는 문서를 긁어오는 게 아니라 실시간으로 대기 하면서 추적하는 형태이기 때문에.

아무튼 파이썬 스크립트를 실행해놓고 일정기간 기다리면 관련 트윗을 꽤 많이 모을 수 있다.

수집한 스트림 내용은 어딘가에 차곡차곡 기록을 해두어야 하니까, txt 파일을 열고 json으로 기록하는 방법을 택했다.

import json

query = ["n번방"]
output_file_name = "stream_result.txt"

with open(output_file_name, "w", encoding="utf-8") as output_file:
    stream = twitter_api.GetStreamFilter(track=query)
    while True:
        for tweets in stream:
            tweet = json.dumps(tweets, ensure_ascii=False)
            print(tweet, file=output_file, flush=True)

한 번 실행해놓으면 오류가 없는 이상 계속 돌아간다.

출력문에서 특정 file에 작성하도록 했다. 그리고 여기서 flush=True를 명시하는 게 중요하다.

중요한 것. GetStreamFilter() 안에서 검색어를 받는 파라미터 track은 리스트 형태로 넣어주어야 한다. 여러 키워드를 동시에 수집할 수도 있으니까. 만약 한 키워드에 공백이 포함된다면 두 키워드가 동시에 포함된 트윗을 필터링한다. (AND 조건)

지금 이 포스팅 작성하면서 10분정도 실행되게 했더니 1000개 정도 수집됐다. ㄷㄷㄷ.

만약 이렇게 수집된 json 파일을 csv와 같은 형식으로 변환하고 싶다면 아래 포스팅을 참고하자. (난 텍스트 분석할 땐 json이 편하던데 아무튼.)


그나저나 내가 트위터 API 앞으로 써먹을 일이 있으려나.

일단 실습은 끝.

나도 파이썬 더 잘하고 싶다.

추천 글

“파이썬과 트위터 API를 활용한 트위터 크롤링 (코드 예제)”의 4개의 댓글

  1. 안녕하세요 트위터로 댓글 수집해서 분석해보려다가 개발자신청 포스팅부터 잘 보았습니다. 도움이 많이되었어요 감사합니다!
    다름이 아니라 스트리밍을 통해서 실시간으로 수집할수있게 되었는데 그 부분중에서 text만 수집하려면 어느부분을 수정해야 하면 좋을지 여쭤보고자 댓글남기게 되었습니다. 바쁘시겠지만 답글기다리겠습니다!

    1. tweets[“text”]라고 적어주시면 되겠네요.
      딕셔너리라 보시면 됩니다.
      아래와 같이 수정하면 될 거예요.
      tweet = json.dumps(tweets[“text”], ensure_ascii=False)

      그런데 분석을 위해 트윗을 수집하는데
      굳이 다른 정보들을 다 생략하시려는 이유가 무엇인지 궁금하네요.
      나중에 텍스트만 따로 뽑아서 작업을 해도 되기 때문에
      저라면 모든 정보를 일단 다 내려 받을 것 같긴 합니다만…
      아무튼 무사히 성공하시길 바라겠습니다. 🙂

  2. 안녕하세요. 좋은 글 감사합니다. 아무튼 워라벨처럼 쉽게 코드 풀어주시는 분들 덕분에 저같은 비전공자도 코딩을 배울수가 있는거 같아요.

    궁금한점이 있는데요, 마지막 스트리밍 부분에서 ‘txt 파일을 열고 json으로 기록’ 한다고 하셨는데 어떤 방식으로 그게 가능한가요? 영어로 된 다른 포스팅에서도 이 부분을 봤는데 도저히 무슨 말인지 모르겠더라구요 ㅠㅠ 혹시 답변주시면 정말 감사하겠습니다.

    1. 댓글 감사합니다.
      그리고 이게 동작하는 방식은 (저도 전문가가 아니라 잘은 모르지만)
      직접 해보시면 딱 감이 오실 겁니다.

      print 함수를 사용할 때 file=”파일명”, flush=True를 적어놓고 실행해보세요.
      파일을 열어 놓으시면 파일에 직접 써지는 걸 보실 수 있을 거예요.

댓글 남기기