블로그로 돌아가기

Python을 사용하여 Twitter 데이터 추출하기

Python을 사용하여 Twitter 데이터 추출하기

Twitter는 단순한 뉴스의 확장된 소스가 아니라, 단연코 전 세계 사람들의 생각을 보여주는 가장 좋은 표본 중 하나입니다. 3억 3천만 명 이상의 활성 사용자를 보유한 Twitter는 사람들이 자신의 생각을 공유하기 좋아하는 최고의 플랫폼 중 하나입니다. Twitter 데이터는 다음과 같은 다양한 목적으로 사용될 수 있습니다. 연구, 소비자 인사이트, 인구통계학적 인사이트, 그리고 더 많은 것들이 있습니다.

따라서 이 튜토리얼의 주된 목적은 프로젝트나 비즈니스에 관련된 Twitter 데이터 샘플을 얻는 방법을 알려주는 것입니다.

계속 진행하기 전에 다음 변수들을 모두 준비해 두었는지 확인하세요:

  1. Consumer Key
  2. Consumer Secret
  3. Access Token
  4. Access Token Secret

위에 언급된 세부 정보를 얻는 방법을 알고 싶다면, 다음 글을 읽어보세요. 제 동료 Dattatray Upase가 작성한 블로그 포스트.

이제 코딩을 시작해 봅시다!

입력 변수 정의하기

먼저 프로그램에 필요한 몇 가지 전역 변수를 정의해야 합니다:

명령줄 인수를 가져오기 위해 ‘sys’를 임포트하고 있습니다. 키워드, 시작일 또는 종료일을 변경하고 싶을 수 있기 때문입니다. 언어로는 영어를 선택했지만, 다른 어떤 언어가 지원되는지 확인해 보셔도 좋습니다. 결과는 마지막에 ‘data’에 저장됩니다.

결과적으로, 이 스크립트의 일반적인 사용법은 다음과 같습니다:

python script.py start_date end_date keyword

Twitter API에 액세스하기
Twitter는 oauth2 인증 프레임워크를 통해 API 사용을 허용합니다. 그들은 트윗 필터링을 수행할 수 있는 문서를 웹사이트에 제공합니다. 위의 코드 조각이 이를 구현해 줄 것입니다.

변수 req_count는 프로그램 실행 중에 API를 사용한 횟수입니다. 제공된 코드에서 다음과 같은 오류가 발생하고 있습니다:

TypeError: Unicode-objects must be encoded before hashing

이를 방지하기 위해, post_body=””를 post_body=b””로 변경하고 있으며, 이렇게 하면 문제가 해결됩니다.

Twitter API 사용법 및 참조

이제 Twitter 데이터를 가져오기 위한 API URL을 설정할 차례입니다. 저는 다음 매개변수를 사용하고 있습니다: min_faves. 다음은 URL에 대한 설명과 몇 가지 최적화 팁입니다:

‘min_faves’은 데이터에서 트윗이 가져야 할 최소 좋아요 수를 설정하는 데 사용됩니다. 매우 유용한 기능이지만 Twitter API 문서에는 언급되어 있지 않습니다.

‘q’은 입력하고자 하는 쿼리 또는 키워드를 나타냅니다. 여기서 가능한 한 적은 키워드를 제공하는 것이 중요합니다. 예를 들어, Facebook과 Google에 대한 트윗을 원한다고 가정해 보겠습니다. 두 가지를 모두 키워드로 제공하면(예: FACEBOOK 및 GOOGLE), 제한 사항 때문에 최대 100개의 트윗만 반환됩니다. 하지만 쿼리를 두 번 실행하여 – 한 번은 Facebook으로, 한 번은 Google로 – 총 200개의 트윗을 얻을 수 있습니다. 요약하자면, 쿼리당 하나의 키워드를 사용하는 것이 좋습니다.

‘lang’은 필터링된 트윗의 언어를 나타냅니다. 영어로 된 트윗을 받고 싶기 때문에 ‘en’으로 설정하고 있습니다.

‘since’은 트윗을 검색하고자 하는 기간의 시작일입니다. 이 시작일은 최근 7일 이내여야 합니다. 이 역시 Twitter API 문서에 기록되어 있지 않은 또 다른 기능입니다.

‘until’은 원하는 기간의 종료일을 나타냅니다. 논리적으로 이 역시 최근 7일 이내여야 합니다. 이 또한 Twitter API 문서에 기록되어 있지 않습니다.

‘result_type’은 원하는 트윗의 종류를 나타냅니다. 여기에는 3가지 값이 있습니다:

‘recent’은 가장 최근의 트윗, 즉 선택한 기간의 끝에 있는 트윗을 제공합니다.

‘popular’은 가장 인기 있는 트윗을 제공하므로 많은 트윗을 놓치게 됩니다. 항상 가장 많은 좋아요와 리트윗을 받은 트윗을 받게 됩니다. min_faves 기능은 여기서는 아무런 소용이 없습니다.

‘mixed’은 최근 트윗과 인기 트윗을 혼합하여 제공합니다.

‘count’은 결과의 최대 트윗 수를 나타냅니다. 기본값은 15로 설정되어 있으며 최대값은 100입니다.

혼합된 result_typemin_faves의 사용을 통해, 쿼리를 여러 번 실행하여 최대 트윗을 얻을 수 있습니다.

더 많은 문서화된 기능을 보려면 다음을 확인할 수도 있습니다: Twitter’s API 문서.

가져온 트윗 데이터 저장/자동 저장

다음 단계로, ‘saveOverride’ 매개변수를 가지는 자동 저장/저장 메서드를 정의해야 합니다. 이 단계는 단순히 자동 저장 시간 제한을 제거하고 파일을 저장하기 위해 필요합니다. 이를 위해, 저는 t_last을 생성하여 프로그램의 시작 시간을 저장합니다. 그런 다음 프로그램에서 이에 접근하여 t_last (마지막 저장 시간) 이후로 5분이 지났는지 확인합니다. 5분 이상 지났다면 ‘saveStatus’를 True로 표시합니다.

다음으로, ‘saveOverride’를 확인합니다. 이는 단순히 무슨 일이 있어도 지금 파일을 저장해야 한다는 지시를 프로그램에 내려야 함을 의미합니다. 이를 위해 saveStatus를 True로 설정합니다.

그런 다음 ‘saveStatus’가 True이면 스크립트는 t_last을 현재 시간으로 변경합니다. 그 후 코드는 딕셔너리 객체를 생성하고 “[time]에 자동 저장”을 출력하여 데이터가 자동 저장되고 있음을 알 수 있도록 합니다.

다음으로, 출력 파일이 이미 존재하는지 확인합니다. 존재한다면, 데이터와 이미 저장된 파일의 데이터를 결합합니다. 결합한 후 동일한 파일에 씁니다. 존재하지 않는다면, 새 파일을 생성한 다음 해당 파일에 데이터를 씁니다.

그 결과, 제가 원했던 거의 모든 기능을 코딩했습니다.

추가 최적화

마지막으로, 이제 이 함수들을 사용할 차례입니다. 저는 while(True)를 의미하는 while(1) 루프를 작성하고 있습니다. 이것은 기본적으로 어떤 ‘break’ 문이 호출되거나 예외가 발생할 때까지 명령이 영원히 실행되도록 합니다.

먼저, 다음을 사용하여 딕셔너리 ‘d’에 트윗 데이터를 수집합니다: json.loads 이것은 데이터를 딕셔너리 형식으로 변환합니다. 그런 다음, try-catch/except를 데이터에서 상태를 추출하는 코드 블록에 실행합니다. 때때로 Twitter API가 데이터를 반환하지 않고 오류를 언급하는 JSON을 반환하기 때문에 try-catch를 사용합니다. 이런 경우에 프로그램이 중단되는 것을 원치 않습니다. 또한, 어떤 요청 번호에서 그런 일이 발생하는지 검색하고 자동 저장 명령을 사용하여 Twitter 데이터를 저장하고 싶습니다. Twitter는 15분당 180개의 요청을 허용합니다. 이는 분당 12개의 요청 또는 5초마다 하나의 요청과 같습니다. 안전을 위해 한 번의 반복을 실행한 후 프로그램을 5초 동안 대기하도록 sleep 명령을 추가합니다.

그 후, 코드는 스크립트가 지금까지 수집한 트윗 수를 표시합니다.

마지막으로, 주요 최적화 기법을 적용할 시간입니다. 저는 거의 일주일 동안 이 스크립트를 테스트했고, 각 min_faves 값에 대해 다음과 같은 트윗 수를 얻었습니다. 요청당 최대 100개의 트윗을 가져올 수 있으며 가능한 한 많이 가져오고 싶습니다. 현재로서는 더 높은 min_faves 값을 가진 트윗이 많지 않지만, 회사나 키워드가 트렌딩하는 경우를 고려하고 싶습니다. min_faves의 최대값은 999999가 될 수 있습니다.

min_faves 값 트윗 수
100,000 1
90,000 1
80,000 1
70,000 2
60,000 3
50,000 6
40,000 6
30,000 12
25,000 12

따라서 저는 다음 값부터 트윗을 가져오는 로직을 사용하고 있습니다: min_faves 값이 60000인 것부터 시작하여 10000에 도달할 때까지 매번 10000씩 감소시킵니다. 하지만 예를 들어 키워드가 트렌디하고, 제가 작업하고 있는 min_faves 값이 30000일 때 100개의 트윗을 얻는다면, 이것은 다음을 증가시킬 것입니다: min_faves35000으로 변경한 다음 결과를 다시 가져옵니다. 따라서 이제 새로운 로직은 10000 대신 5000이 됩니다. 하지만 변화량이 1000 미만으로 감소하면, 이를 무시하고 1000을 빼는 과정을 진행하도록 요청합니다.

저는 다음과 같이 고정된 간격인 1000을 지정하고 있습니다. 이 값은 min_faves가 감소해야 하는 값입니다. 만약 min_faves가 10000보다 작거나 같을 때 말이죠.

프로그램이 끝나면, 프로그램은 ‘End’를 표시하여 작업이 완료되었음을 알려줍니다.

전체 코드는 다음에서 찾을 수 있습니다: GitHub.

이상입니다. 다음 Twitter 데이터 튜토리얼에서는 빅데이터 도구인 ‘Flume’을 사용하여 실시간 트윗을 수집하는 방법을 알려드리겠습니다. 계속 지켜봐 주세요!

author

Akshay Nagpal

작성자 · CloudSigma

Preslav Dobrev는 CloudSigma의 크리에이티브 디자이너로서, 전통적이고 혁신적인 마케팅 채널을 활용하여 일관된 비즈니스 정체성을 구축하는 데 중점을 두고 있습니다. 그는 영향력 있는 브랜드 내러티브를 창출하기 위해 예술적 비전과 전략적 마케팅을 결합하는 데 능숙합니다.

댓글

아직 댓글이 없습니다. 첫 번째로 작성해 보세요.