[텍스트분석] 트위터 스크래핑 : snscrape

young·2022년 10월 14일
0

텍스트 분석

목록 보기
1/2
post-thumbnail

문제 상황

트위터 크롤링 어떻게 진행하지?

현재 진행하는 프로젝트에서 데이터 수집을 위해 트위터에서 스크래핑을 진행하기로 결정했다.
트위터 스크래핑을 위해 기존에 알고 있던 스크래핑 방법인
selenium트위터 API를 이용하여 스크래핑을 시도하였다.

스크래핑되는 데이터의 한계

트위터 API

현재 무료로 제공되는 트위터 API는 개발자 신청도 필요하고, 스크래핑을 하더라도 7일간의 트윗까지만 제공되며 스크래핑되는 데이터 수에도 한계가 있다.

selenium

셀레니움과 뷰티풀숲을 이용하여 크롤링을 진행하면 트위터 API보다 많은 데이터를 스크래핑할 수는 있지만, 생각보다 스크래핑되는 데이터 수가 심각하게 적었다.

snscrape 모듈

유튜브 영상 : Get UNLIMITED Tweets by Python Without Twitter API
스크래핑 방법을 구글링하던 중 이 영상을 찾았다!

"snscrape is a scraper for social networking services (SNS). It scrapes things like user profiles, hashtags, or searches and returns the discovered items e.g. the relevant posts."
snscrape 공식 문서

snscrape는 SNS 스크래핑을 위한 파이썬 모듈 패키지로, 페이스북, 인스타그램, 트위터, 텔레그램, 레딧 등의 sns 스크래핑이 가능하다.

  • API나 셀레니움을 이용한 방법보다 코드도 간단하며,
  • 가져오는 데이터의 수도 제한이 없으며
  • 상세 검색으로 날짜나 계정을 지정한 뒤
    검색하여 뜨는 글 스크래핑이 가능하다.

sns별로 스크래핑이 가능한 정보는 아래와 같다.

snscrape의 sns별 정확한 이용 방법은 공식 문서와 위 유튜브 영상 참고

snscrape로 트위터 스크래핑하기

스크래핑 전체 코드

pip install snscrape
pip install pandas

import snscrape.modules.twitter as sntwitter
import pandas as pd

query = "python"
tweet_list = []  
limit = 100 

for tweet in sntwitter.TwitterSearchScraper(query).get_items(): 

    if len(tweet_list) == limit: 
    	break
    else:
         tweet_list.append([tweet.date, tweet.user.username, tweet.user.displayname, tweet.content, tweet.url])
        
         
df = pd.DataFrame(tweet_list, columns = ['Date', 'User', 'Nickname', 'Tweet', 'URL'])

print(df) 

df.to_csv('python.csv', encoding='utf-8-sig') 

TwitterSearchScraper로 가져오는 결과

위 코드의 TwitterSearchScraper 함수로 스크래핑한 트위터 데이터에서 가져오는 값들은 트위터 URL, 작성 날짜, 트윗 내용, 계정 아이디, 닉네임, 사진 링크를 포함하여 여러 값들이 딕셔너리 형태로 저장된다.

네모친 것들 이외에도 여러 정보가 저장된다.

코드 이해

snscrape 설치

먼저 터미널이나 자신이 사용하는 툴에서 snscrape를 설치해주어야 한다.

pip install snscrape

패키지 임포트

스크래핑을 위한 패키지인 snscrape와 데이터 처리를 위한 pandas를 임포트한다.

import snscrape.modules.twitter as sntwitter
import pandas as pd

스크래핑할 검색어 지정

트위터에서 스크래핑할 검색어를 지정해준다.
데이터 프레임을 만들기 위해 빈 리스트를 만들고,
필요하다면 가져올 트윗의 수를 제한한다.

query = "python"
tweet_list = []  #데이터 프레임을 만들기 위한 빈 리스트 지정
limit = 100 #트위터 글을 100개까지만 가져오도록 설정

트위터 스크래핑

원하는 트위터 글의 스크래핑을 위해 TwitterSearchScraper 함수를 이용해 스크래핑한 후, 빈 리스트에 추가한다.

for tweet in sntwitter.TwitterSearchScraper(query).get_items(): 
#query 부분에 검색어가 들어감
    if len(tweet_list) == limit: #트위터 글이 100개 이상인 경우 트위터 글을 더 이상 가져오지 않음
    	break
    else:
         tweet_list.append([tweet.date, tweet.user.username, tweet.user.displayname, tweet.content, tweet.url])
         #트윗 날짜, 유저 아이디, 유저 닉네임, 트윗 글, 트윗 주소를 가져옴

데이터 프레임 만들기

스크래핑한 트위터 데이터를 컬럼명을 부여하여 데이터 프레임으로 만든다.

df = pd.DataFrame(tweet_list, columns = ['Date', 'User', 'Nickname', 'Tweet', 'URL'])
#가져온 데이터에 맞게 컬럼명 지정

print(df) #데이터 프레임이 잘 만들어졌는지 확인

csv 파일로 저장하기

데이터 프레임으로 만들어진 스크래핑 데이터를 csv 형식으로 저장한다.
한글 트위터를 가져오는 경우 한글 깨짐 오류가 발생하므로 반드시 인코딩 형식을 지정한다.

#csv로 저장
df.to_csv('python.csv', encoding='utf-8-sig') 
#한글이 깨지므로 반드시 인코딩 형식 설정

결과

코드를 실행하면 스크래핑된 데이터가 데이터 프레임으로 깔끔하게 저장된다.

profile
한 걸음씩 쌓아가는 데이터 분석

4개의 댓글

comment-user-thumbnail
2023년 1월 2일

공유해주셔서 감사합니다!!!

1개의 답글