본문 바로가기

STUDY

[PYTHON] 파이썬으로 Twitter Crawler 구현

개발에서 손땐지가 3~4년 된 것 같다. 

아키텍처와 설계 문서를 작성하고 가이드하고 프로젝트를 리딩하는 업무로 바뀐지가 그 정도 되는 것인데

아직 개발에 대한 욕심은 아주 조금 남아 있는 듯하다. 

 

다양한 재난 정보를 모아서 하나의 통일된 창구를 통해서 공유하고 제공하는 프로젝트를 수행하는 중인데, 과업범위 내에 트위터의 재난 키워드를 이용해서 트위터 사용자들의 여론을 보고자 하는 것이다. 

 

페이스북, 트위터, 인스타그램 등 시민들이 이용하는 다양한 SNS 어플리케이션이 있지만, 이 중에서 오픈되어 있는 API를 제공하는 트위터 밖에 없다. 그래서 트위터를 이용해서 크롤러를 구현하고 빅데이터 기반으로 저장해서 여론 분석을 한다던지, 실시간 트윗을 보여준다던지, 저장된 대용량의 트윗을 다시 또 제공한다던지하는 일들이 벌어지고 있다. 

 

현재 시점에서는 트위터의 사용자가 2018년을 기점으로 100만명이 감소해 주가가 20%가 폭락했다는 기사도 있는 것으로 보아 우리 나라에서는 인스타그램이 현재는 대세이며 트위터는 표현의 한계와 인스타그램 대비 사용의 불편함과 모바일 디바이스 시장의 확장이 사용자 감소에 한 몫하지 않았나 생각한다. 

 

하여튼, 

일은 일이니까 트위터 API를 이용해서 Crawler를 구현해보았다. 

 

조사

트위터 API는 크게 쿼리를 통해 트위터의 트윗을 쿼리해 오는 방법도 있지만,

실시간으로 발생된 트윗 정보를 가져와야 하기 때문에 Twitter Streaming API를 활용하였다.

 

구현

 

실행을 위해 프로그램의 진입점을 정의한 CrawlerStarter.py 클래스와

Twitter Streaming을 구현한 StreamingListener.py로 구분하여 구현하였다.

 

 

CrawlerStarter.py

 

tweepy를 사용하기 위해 발급한 cKey,Cret, aToken, aCret를 활용하여 인증을 하는 코드를 삽입한다.

 

cKey="keykeykeykey"

cCret="CretCretCretCretCretCret"

aToken="Tototototoken"

aCret="aCretaCretaCretaCretaCret"

 

auth = tweepy.OAuthHandler(cKey, cCret)

auth.set_access_token(aToken, aCret)

 

TRACK 키워드 3가지를 정의하여 대입하고 TRACK 변수를 filter에 입력한다.

 

TRACK=["나", "너", "여기", "아니","우리","니","저기","이거","저거","이것","남자","여자","환자","병","예","환자","차","버스","지하철","혼자","나는","너는"]

 

stream = Streaming.StreamingListener()

twitterStream = Stream(auth, stream)

twitterStream.filter(track=TRACK)

 

Streaming.py

 

Twitter 클래스를 정의한다.

 

filePath = "D:/"

fileName = "twitter_raw_data_"

fileSeq = "_temp"

fileTyp = ".txt"

 

twitter = Twitter()

 

Twitter 클래스에는 몇가지 구현 가능한 함수를 제공한다.

 

스트림을 통해 데이터를 수신하는 함수

def on_data(self, data):

self.jsonCreator(json.loads(data))

return(True)

 

연결되었음을 알려주는 함수

def on_connect(self):

self.crwLogger.info("Connected to Streaming Server.")

 

연결 종료를 알려주는 함수

def on_disconnect(self, exception):

self.crwLogger.info("This Connection is Distroyed.")

 

등과 같이 몇가지의 함수가 더 존재한다. 

 

def on_data를 통해서 키워드로 필터링 된 실시간 트윗 정보를 조회할 수 있다.

 

def jsonCreator(self, jsonData):

try:

  if jsonData['coordinates'] is not None:

    self.count+=1

    f = open(self.filePath+self.fileName+self.fileTyp, 'a', encoding='utf-8', newline='')

    wr = csv.writer(f)

    userInfo = jsonData["user"]

    wr.writerow([self.count, userInfo["name"], jsonData["created_at"], userInfo["screen_name"], jsonData["text"],        

    jsonData['coordinates'], jsonData])

    f.close()

except Exception :

   return None

 

 

 

 

...

 

재난 정보에서의 트윗 정보는 트윗의 확산성과 정보 전달력을 통해 재난 정보를 신속하게 전파하고 실시간 트윗을 통해 재난 발생 정보를 조기에 획득할 수 있다는 장점이 있다. 이를 통해 재난 상황의 확산과 조기 진화, 예방 활동도 트윗을 통해 기여할 수 있으리라고 생각하지만 이 다양한 것을 하려면 가장 중요한 것은 '위치정보'이다. 

 

일본과 미국에서는 트위터의 재난 키워드와 위치 정보를 활용해 분석하고 GIS를 통해 클러스터하여 정보를 표출한다. 이를 통해 어떤 지역에서 요구조자가 많은지, 요구조자 주변 어디에 대피로와 안전을 보장받을 수 있는 대피소가 있는지를 복합하여 제공할 수 있게 된다. 

 

모바일 디바이스의 개인정보가 중요시 됨에 따라서 위치 정보는 공개할 수 없고, 수집하기 또한 까다롭다. 

 

지금 구현해놓은 Twitter Crawler를 통해 24시간을 가동해본 결과 약 6만건의 트윗이 저장되어 있지만 그 중에서 위치 정보를 통해 트윗의 위치가 식별 가능한 것은 단 15건에 불과했으며, 그 15건도 재난과 관련된 키워드가 아닌 광고 트윗이다 보니 사용자가 자기의 위치를 실시간 트윗으로 알린다는 것은 개인정보 보호와 개인의 신상에 지극히 위험한 일임을 다시한번 깨닫는다.