본문 바로가기
데이터&AI/데이터분석

Reddit 데이터 수집하기 using API (PYTHON)

by 일등박사 2024. 9. 12.
728x90

안녕하세요!!

 

오늘은 미국의 유명 커뮤니티 Reddit 의 데이터를 api를 활용해서 수집해보겠습니다!!

 

(회원가입!은 생략합니다!! 추천은 google 연동 말고 id/pw를 만들어 가입하세요!!)

 

 

A. Reddit API란?

Reddit API는 Reddit의  개시글들을 숩게 접근할수 있도록 해줍니다!!!

B.  무료 인가!!!?

Reddit API는 기본적으로 무료로 사용할 수 있습니다.  무료 제공 범위가 충분합니다.!!!

주요기능은~~~

  • 서브레딧 데이터 접근: 특정 서브레딧에서 인기 있는 게시물이나 최근 게시물의 정보를 가져올 수 있습니다. 예를 들어, /r/python 서브레딧의 최신 게시글을 자동으로 수집할 수 있습니다.
  • 사용자 정보 조회: 특정 사용자의 정보(게시물, 댓글, karma 점수 등)를 확인할 수 있습니다.
  • 댓글 및 게시물 수집: 게시물의 댓글과 관련 데이터를 수집할 수 있습니다.
  • API 호출 제한: Reddit API는 무료 사용자에게 1분에 약 60회의 호출을 허용합니다. 

C. Reddit API 유료는??>?

 전문적인 사용자를 위한 유료 API 서비스도 제공하는데,,, 이건 대량수집, 상업적 목정일떄입니다!!

그래서 로출 제한을 높이고 실시간 정보를 받고, 고객지원을 받을수 있습니다!!

D. 무료와 유료 API 비교

                                        

  무료!!! 유료!!!
API 호출 횟수 1분에 약 60회 더 많은 호출 횟수 가능
데이터 접근 기본 게시물, 댓글, 사용자 정보 고급 데이터 및 실시간 트렌드 분석
지원 서비스 기본 지원 우선 지원
사용 목적 개인 프로젝트, 소규모 서비스 상업적 사용, 대규모 데이터 수집

 


이제!!  본격적으로 시작해보아요!!

1. Reddit API에 앱 등록

 

https://old.reddit.com/prefs/apps/

 

Reddit - Dive into anything

 

old.reddit.com

 

개발자패이지에서

 

 

create app 클릭!

 

 

기본 정보를 입력하고@!  create app!!  (redirect uri는 우선 그냥 네이버로 실시!@!

 

그럼 이제 키가 생성됩니다!!

 

 

지금까지 나온 정보로 알수있는 나의 정보는

계정ID : DocumentKey6026 

계정의 PW : 내가 알고있음!!

client_id와 client_pw (위 이미지의 두 화살표들!!)

 

 

2. Reddit API에 앱 등록

 - 아래와 같이 해서 Token 을 받습니다!!

import requests
from requests.auth import HTTPBasicAuth

# Reddit 앱의 정보 (client_id와 client_secret)
client_id = 'h_jSPAsN_l8grD0uAzmosA(<< 이부분은 ID)'
client_secret = '{시크릿키!!}'

# Reddit 사용자 로그인 정보
username = 'DocumentKey6026'
password = '{내 계정비번}'

# POST 데이터 (password grant_type 사용)
data = {
    'grant_type': 'password',
    'username': username,
    'password': password
}

# POST 요청 헤더
headers = {
    'User-Agent': 'DocumentKey6026'
}

# HTTP Basic 인증 (client_id와 client_secret 사용)
auth = HTTPBasicAuth(client_id, client_secret)

# POST 요청 보내기
response_auth = requests.post(
    'https://www.reddit.com/api/v1/access_token',
    headers=headers,
    data=data,
    auth=auth
)

# 응답 출력
if response_auth.status_code == 200:
    print("Access token:", response_auth.json())
else:
    print(f"Error: {response_auth.status_code}")
    print(response_auth.text)

 

이렇게하면~~

아래와 같이 나만의 토큰을 발급받게됩니다!!

 

3. 내 계정정보조회!!

이제, 이 토큰으로 모든것을 할수 있습니다!

내 계정 정보를 조회해보아요!!

# 토큰 정보
token =  response_auth.json()['access_token']
# 요청 헤더
headers = {
    'Authorization': f'Bearer {token}'
}

# 요청을 보낼 URL (예시)
url = 'https://www.reddit.com/api/v1/me'

# GET 요청 보내기
response = requests.get("https://oauth.reddit.com/api/v1/me", headers=headers)
response.json()

언제가입했는지, 글을 얼마나썻는지 등등을 다 볼수 있어요!!

 

 

 

 

4. Best글 보기!!!

아래와 같이 간단한 코드로 진행 가능합니다!!!!

# 요청을 보낼 URL
url = 'https://oauth.reddit.com/best'

# GET 요청 보내기
response = requests.get(url, headers=headers)
best_json = response.json()
best_json

데이터 이해를 위해 DF로 만들어보면!?

import pandas as pd
df_best = pd.DataFrame(best_json['data']['children'])
df_best

 

아래와 같이 25개의 컨텐츠를 가져옴을 확인할 수 있습니다!!

 

 

그리고 각각의 ROW는 아래와 같이  컨텐츠에 대한 세부사항정보가 있었습니다!!

세부정보는~~ 작성자 ID, URL, 작성시간 좋아요수, 썸네일이미지 등등의 정보가있네요~!^^

{'approved_at_utc': None,
 'subreddit': 'gadgets',
 'selftext': '',
 'author_fullname': 't2_2uwit82z',
 'saved': False,
 'mod_reason_title': None,
 'gilded': 0,
 'clicked': False,
 'title': 'PS5 disc drive is selling out after PS5 Pro announcement ',
 'link_flair_richtext': [],
 'subreddit_name_prefixed': 'r/gadgets',
 'hidden': False,
 'pwls': 6,
 'link_flair_css_class': 'gaming',
 'downs': 0,
 'thumbnail_height': 78,
 'top_awarded_type': None,
 'hide_score': False,
 'name': 't3_1feilcl',
 'quarantine': False,
 'link_flair_text_color': 'dark',
 'upvote_ratio': 0.91,
 'author_flair_background_color': None,
 'ups': 2050,
 'total_awards_received': 0,
 'media_embed': {},
 'thumbnail_width': 140,
 'author_flair_template_id': None,
 'is_original_content': False,
 'user_reports': [],
 'secure_media': None,
 'is_reddit_media_domain': False,
 'is_meta': False,
 'category': None,
 'secure_media_embed': {},
 'link_flair_text': 'Gaming',
 'can_mod_post': False,
 'score': 2050,
 'approved_by': None,
 'is_created_from_ads_ui': False,
 'author_premium': True,
 'thumbnail': 'https://a.thumbs.redditmedia.com/ehtraS8BbbDYBCcUezEFJYy1As-Tndb2cDgQRPiSu38.jpg',
 'edited': False,
 'author_flair_css_class': None,
 'author_flair_richtext': [],
 'gildings': {},
 'post_hint': 'link',
 'content_categories': None,
 'is_self': False,
 'subreddit_type': 'public',
 'created': 1726082307.0,
 'link_flair_type': 'text',
 'wls': 6,
 'removed_by_category': None,
 'banned_by': None,
 'author_flair_type': 'text',
 'domain': 'insider-gaming.com',
 'allow_live_comments': False,
 'selftext_html': None,
 'likes': None,
 'suggested_sort': None,
 'banned_at_utc': None,
 'url_overridden_by_dest': 'https://insider-gaming.com/ps5-disc-drive-is-selling-out-after-ps5-pro-announcement/',
 'view_count': None,
 'archived': False,
 'no_follow': False,
 'is_crosspostable': True,
 'pinned': False,
 'over_18': False,
 'preview': {'images': [{'source': {'url': 'https://external-preview.redd.it/FBud8-iv8x3Pw1jA-wF-KuMmzopIIIRdjeSii542ZSc.jpg?auto=webp&amp;s=fc3870a9d242b70d2f22359e6bfda5ec23611134',
     'width': 1723,
     'height': 969},
    'resolutions': [{'url': 'https://external-preview.redd.it/FBud8-iv8x3Pw1jA-wF-KuMmzopIIIRdjeSii542ZSc.jpg?width=108&amp;crop=smart&amp;auto=webp&amp;s=3a4fa92800c12545c22ee673292b5f3769ff53db',
      'width': 108,
      'height': 60},
     {'url': 'https://external-preview.redd.it/FBud8-iv8x3Pw1jA-wF-KuMmzopIIIRdjeSii542ZSc.jpg?width=216&amp;crop=smart&amp;auto=webp&amp;s=e1d0f203da7fd925b60cc0953f9ffc896e81a6a6',
      'width': 216,
      'height': 121},
     {'url': 'https://external-preview.redd.it/FBud8-iv8x3Pw1jA-wF-KuMmzopIIIRdjeSii542ZSc.jpg?width=320&amp;crop=smart&amp;auto=webp&amp;s=20c91662388dd3e7706e0a25a46d1c548618920d',
      'width': 320,
      'height': 179},
     {'url': 'https://external-preview.redd.it/FBud8-iv8x3Pw1jA-wF-KuMmzopIIIRdjeSii542ZSc.jpg?width=640&amp;crop=smart&amp;auto=webp&amp;s=85d0a0d526195dd5b2a05bd09e50d0b854ce69d5',
      'width': 640,
      'height': 359},
     {'url': 'https://external-preview.redd.it/FBud8-iv8x3Pw1jA-wF-KuMmzopIIIRdjeSii542ZSc.jpg?width=960&amp;crop=smart&amp;auto=webp&amp;s=31942fe65cee7738ef1270365a0282121add2630',
      'width': 960,
      'height': 539},
     {'url': 'https://external-preview.redd.it/FBud8-iv8x3Pw1jA-wF-KuMmzopIIIRdjeSii542ZSc.jpg?width=1080&amp;crop=smart&amp;auto=webp&amp;s=5917d184b139b9fc24912be863595aa2f1d8e5c5',
      'width': 1080,
      'height': 607}],
    'variants': {},
    'id': '-hglatMX5TsjcYductzPPzz6aLXoR2icoLX3fC0pxkw'}],
  'enabled': False},
 'all_awardings': [],
 'awarders': [],
 'media_only': False,
 'link_flair_template_id': '7de51ac0-5bb7-11e4-824f-12313b0eb533',
 'can_gild': False,
 'spoiler': False,
 'locked': False,
 'author_flair_text': None,
 'treatment_tags': [],
 'visited': False,
 'removed_by': None,
 'mod_note': None,
 'distinguished': None,
 'subreddit_id': 't5_2qgzt',
 'author_is_blocked': False,
 'mod_reason_by': None,
 'num_reports': None,
 'removal_reason': None,
 'link_flair_background_color': '',
 'id': '1feilcl',
 'is_robot_indexable': True,
 'report_reasons': None,
 'author': 'chrisdh79',
 'discussion_type': None,
 'num_comments': 391,
 'send_replies': False,
 'whitelist_status': 'all_ads',
 'contest_mode': False,
 'mod_reports': [],
 'author_patreon_flair': False,
 'author_flair_text_color': None,
 'permalink': '/r/gadgets/comments/1feilcl/ps5_disc_drive_is_selling_out_after_ps5_pro/',
 'parent_whitelist_status': 'all_ads',
 'stickied': False,
 'url': 'https://insider-gaming.com/ps5-disc-drive-is-selling-out-after-ps5-pro-announcement/',
 'subreddit_subscribers': 22566401,
 'created_utc': 1726082307.0,
 'num_crossposts': 0,
 'media': None,
 'is_video': False}

 

 

 

ㅁ 참고 : https://github.com/reddit-archive/reddit/wiki/OAuth2

ㅁ 참고2 : https://www.reddit.com/dev/api/

 

728x90

댓글