praw로 레딧 크롤링하기

영이·2024년 5월 9일
1

들어가며

레딧에서 비트코인 관련 유저들의 반응을 살펴보기 위해 레딧의 글(submission)과 댓글(comment)을 모은 데이터를 구축하고자 하였다. 직접 크롤링하기에는 귀찮아서 여러 가지 검색해본 결과 python에서 praw라는 패키지를 이용할 수 있다는 점을 알게 되었다. 한국어 자료가 많이 없어서 최신 정보를 정리해보고자 글을 쓴다.
참고로 예전 블로그 글들에서 찾아볼 수 있는 아카이브 데이터 (pushshift) 는 현재 접근 불가하므로 직접 크롤링하거나 Praw를 이용해야 한다.

Praw란

레딧에서 제공하는 API로 레딧 데이터를 접근할 수 있도록 해주는 파이썬 패키지이다.
공식 문서 링크(https://praw.readthedocs.io/en/stable/)를 참고하면 더 많은 기능을 알아볼 수 있다. 크롤링 말고도 다른 기능을 많이 제공하는 것 같다.
패키지 설치 방법은 다음과 같다.

pip install praw

사용 방법

사용하기 이전에 레딧에서 개발자 앱을 등록해야 API 키를 발급받을 수 있다.

  1. 레딧 회원가입을 한다. 이때 비밀번호가 꼭 등록되어 있어야 사용 가능하다.
  2. https://www.reddit.com/prefs/apps 에 접속한다. 하단에 create another app... 버튼을 클릭한다.
  3. name에는 앱의 이름을, redirect url에는 http://localhost:8080 을 입력하면 된다.
  4. 앱을 만들면 이런 화면이 뜨는데, 위쪽 까만색 부분에 적혀있는 것이 client_id, 아래쪽 까만색 부분에 적혀 있는 것이 client_secret 값이다.

이제 사전 준비가 완료되었다.

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 등등에서 찾을 수 있는 많은 수의 레딧 크롤러들의 사정이 비슷하다. 더 많은 데이터가 필요한 경우에는 직접 크롤링 등의 다른 방법을 찾아야 할 것 같다.

profile
연구가 싫었는데 어쩌다보니 대학원생이 되어버린 몸

0개의 댓글