레딧에서 비트코인 관련 유저들의 반응을 살펴보기 위해 레딧의 글(submission)과 댓글(comment)을 모은 데이터를 구축하고자 하였다. 직접 크롤링하기에는 귀찮아서 여러 가지 검색해본 결과 python에서 praw라는 패키지를 이용할 수 있다는 점을 알게 되었다. 한국어 자료가 많이 없어서 최신 정보를 정리해보고자 글을 쓴다.
참고로 예전 블로그 글들에서 찾아볼 수 있는 아카이브 데이터 (pushshift) 는 현재 접근 불가하므로 직접 크롤링하거나 Praw를 이용해야 한다.
레딧에서 제공하는 API로 레딧 데이터를 접근할 수 있도록 해주는 파이썬 패키지이다.
공식 문서 링크(https://praw.readthedocs.io/en/stable/)를 참고하면 더 많은 기능을 알아볼 수 있다. 크롤링 말고도 다른 기능을 많이 제공하는 것 같다.
패키지 설치 방법은 다음과 같다.
pip install praw
사용하기 이전에 레딧에서 개발자 앱을 등록해야 API 키를 발급받을 수 있다.
이제 사전 준비가 완료되었다.
import praw
reddit = praw.Reddit(
client_id="...",
client_secret="...",
password="...",
user_agent="testscript by u/...",
username="...",
)
위의 코드를 입력한다. username은 레딧 아이디, password는 레딧 비밀번호다. (구글 이메일 등으로 간편 가입한 경우 비밀번호가 설정되지 않은 상태이므로 사전에 꼭 레딧 비밀번호를 설정해야 한다.)
실행시키면 레딧 크롤링할 준비가 끝난 것이다.
subreddit = reddit.subreddit('Bitcoin')
for submission in subreddit.new(limit=None):
submission.comments.replace_more(limit=None)
for comment in submission.comments.list():
print(comment.created_utc, comment.body)
위의 코드는 Bitcoin이라는 서브레딧을 불러온 이후, 최신 순으로 레딧 submission 내 comment를 출력하는 코드이다.
limit 안에 값을 입력하면 그 숫자 개수만큼 불러오는데, None을 줘서 제한 없이 크롤링하려고 해도 약 1000개 정도의 submission만 접근 가능하다는 점을 유념하자.
replace_more는 더보기를 계속 해서 모든 comment를 접근할 수 있도록 하는 코드이다.
created_utc를 사용하면 게시 시간을 unix time으로 변환한 값을 반환한다. 이는 파이썬의 datetime를 이용하면 일반적인 시간으로 변환가능하다.
그외 기능은 위에서 언급했던 praw 공식 위키를 보고 따라하면 된다.
Reddit API를 이용하는 방식인데, 이 API는 특정 기간의 데이터를 불러오는 등의 기능이 구현되어 있지 않고, 최대 1k개 정도의 글만 불러올 수 있다...
praw뿐만 아니라 github 등등에서 찾을 수 있는 많은 수의 레딧 크롤러들의 사정이 비슷하다. 더 많은 데이터가 필요한 경우에는 직접 크롤링 등의 다른 방법을 찾아야 할 것 같다.