본문 바로가기

major/Python

파이썬 트위터 크롤링하기 - twitterscraper

++9월 24일 내용 추가합니다.

twitterscraper가 동작하지 않고 있습니다. 

issue 해결이 될 때 까지는 트위터 측에서 제공하는 공식 API를 사용하셔야 될 것 같습니다.

 

++6월 5일 내용 추가합니다.

6월 2일부터 twitterscraper로 트위터 크롤링이 안되는 현상이 발생되었습니다.

twitterscraper 깃헙의 이슈에 가면 자세한 상황을 확인할 수 있습니다. 

 

twitterscraper github issue 바로가기

 

이슈에서 사용자들이 제안하는 해결방법은, twitterscraper의 query.py 파일의 29번째 줄

HEADER = {'User-Agent': random.choice(HEADERS_LIST)}

을 다음과 같이 변경하는 것입니다.

HEADER = {'User-Agent': random.choice(HEADERS_LIST), 'X-Requested-With': 'XMLHttpRequest'}

제가 해본 결과 위 코드 한줄만 변경하면 twitterscraper가 제대로 동작했습니다.

twitterscraper 패키지가 깔려있는 위치를 찾고 query.py 파일만 변경하면 됩니다. 모르겠으면 댓글 남겨주세요.


파이썬 3.7.6을 기준으로 작성된 문서입니다.

 

twitterscraper 패키지를 사용해서 파이썬으로 트위터 크롤링을 해보겠습니다.

twitterscraper는 깃헙에 MIT License로 올라와있기 때문에 저작권 명시만 해준다면 수정 및 배포가 자유롭습니다.

 

twitterscraper github 바로가기

 

먼저 twitterscraper를 설치합니다.

pip install twitterscraper

 

1. 아이디를 아는 유저의 정보 가져오기

"BTS_twt"라는 아이디를 가진 유저의 정보를 가져와 보겠습니다.

from twitterscraper.query import query_user_info

twitter_user = "BTS_twt"
user_info = query_user_info(user= twitter_user)

print("user : "+user_info.user)
print("fullname : "+user_info.full_name)
print("location : "+user_info.location)
print("blog : "+user_info.location)
print("date_joined : "+user_info.date_joined)
print("id : "+user_info.id)
print("num_of_tweets : "+str(user_info.tweets))
print("following : "+str(user_info.following))
print("follower : "+str(user_info.followers))
print("likes : "+str(user_info.likes))
print("lists : "+str(user_info.lists))

실행을 시켜주면 아래와 같이 결과화면이 나옵니다.

결과 화면

2. 아이디를 아는 유저의 트윗 가져오기

"BTS_twt"라는 아이디를 가진 유저의 트윗을 가져오겠습니다.

from twitterscraper.query import query_tweets_from_user

twitter_user = "BTS_twt"

list_of_tweets = query_tweets_from_user(twitter_user, limit=10)
for tweet in list_of_tweets:
    print("timestamp: "+str(tweet.timestamp))
    print("text: "+tweet.text)

limit=10 태그를 줘서 BTS_twt 유저가 올린 트윗중 10개를 가져오게 합니다.

정확하게 10개는 아니고, 한 뭉탱이로 트윗을 가져오는데 limit이 넘으면 크롤링을 중단합니다.

결과 화면

limit=10으로 줬을 때 한번에 19개의 트윗을 가져왔습니다.

10개가 넘었기 때문에 크롤링을 중단하고 가져온 트윗을 전부 출력했습니다.

 

begindate, enddate같은 태그를 줘서 그 사이에 올린 트윗만 가져오게 할 수도 있습니다.

 

3. 키워드를 포함한 트윗 가져오기

'코로나바이러스'를 포함한 트윗을 가져오겠습니다.

import datetime
from twitterscraper import query_tweets

list_of_tweets = query_tweets('코로나바이러스', begindate=datetime.date(2020,2,1), enddate=datetime.date(2020,2,2), limit=10)

for tweet in list_of_tweets:
    print("screen_name: "+tweet.screen_name) #사용자아이디
    print("username: "+tweet.username) #닉네임
    print("timestamp: "+str(tweet.timestamp)) #날짜
    print("text: "+tweet.text) #트윗내용

begindate, enddate 태그를 줘서 2020년 2월 1일부터 2020년 2월 2일 사이에 작성된 글을 가져오게 했습니다.

결과화면

'코로나바이러스' 키워드를 포함한 트윗 중 2020년 2월 1일부터 2020년 2월 2일 사이에 작성된 트윗을 가져와서

사용자아이디, 닉네임, 날짜, 트윗내용을 출력했습니다.

 

트윗에서 가져올 수 있는 정보는 이것보다 더 많습니다.

print("screen_name: "+tweet.screen_name) #사용자아이디
print("username: "+tweet.username) #닉네임
print("user_id: "+tweet.user_id)
print("tweet_id: "+tweet.tweet_id)
print("tweet_url: "+tweet.tweet_url)
print("timestamp: "+str(tweet.timestamp)) #날짜
print("timestamp_epchs: "+str(tweet.timestamp_epochs))
print("text: "+tweet.text) #트윗내용
print("text_html: "+tweet.text_html)
print("links: "+str(tweet.links))
print("hashtags: "+str(tweet.hashtags))
print("has_media: "+str(tweet.has_media))
print("img_urls: "+str(tweet.img_urls))
print("video_url: "+str(tweet.video_url)) 
print("likes: "+str(tweet.likes))
print("reweets: "+str(tweet.retweets))
print("replies: "+str(tweet.replies))
print("is_replied: "+str(tweet.is_replied))
print("is_reply_to: "+str(tweet.is_reply_to))
print("parent_tweet_id: "+tweet.parent_tweet_id)
print("reply_to_users: "+str(tweet.reply_to_users))

제가 트위터에 익숙하지 않아서 의미를 모르는 태그들이 더 많습니다.

 

4. 가져온 트윗을 TXT파일로 저장

import datetime
from twitterscraper.query import query_tweets

keyword = '코로나바이러스'
f = open(keyword+'.txt',mode='w',encoding='utf-8')

list_of_tweets = query_tweets(keyword, begindate=datetime.date(2020,2,1), enddate=datetime.date(2020,2,2), limit=1000)
for tweet in list_of_tweets:
    f.write(str(tweet.text)+'\n')

f.close()

5. 가져온 정보를 CSV파일로 저장

from twitterscraper.query import query_tweets
import csv
import datetime

keyword = '코로나바이러스'
f = open(keyword+'.csv','w',encoding='utf-8-sig',newline='')
w = csv.writer(f,delimiter=',')

list_of_tweets = query_tweets(keyword, begindate=datetime.date(2020,2,1), enddate=datetime.date(2020,2,2), limit=1000)
for tweet in list_of_tweets:
        w.writerow([tweet.timestamp, tweet.text])
f.close()

 

티스토리 블로그 개편하고 코드를 올리는게 처음인데 컬러스크립트도 이상하게 되고, 자체적으로 제공하는 코드블럭도 글을 작성할때와 보여줄때가 달라서 이상하네요. 

갑자기 첫줄 들여쓰는것도 이상합니다.

제가 보기좋게 작성하는걸 좋아하기때문에 문제를 해결하면 얼른 고치도록 하겠습니다.


잘못된 내용이 있다면 언제든지 댓글이나 메일로 알려주시면 감사하겠습니다.

이 포스팅이 도움이 되었다면 공감 부탁드립니다.

궁금한 점은 언제든지 댓글 남겨주시면 답변해드리겠습니다:D