Reddit 데이터를 긁는 방법: 게시물, 이미지, 댓글 등.

36978 단어 apiwebscrapingtutorial

소개



Reddit.com은 투표를 통해 사이트 회원이 콘텐츠를 사회적으로 큐레이팅하고 홍보하는 소셜 뉴스 웹사이트 및 포럼입니다.

이 기사에서는 Page2API으로 Reddit 게시물과 댓글을 스크랩하는 가장 쉬운 방법에 대해 읽고 Python에서 몇 가지 코드 예제를 찾을 수 있습니다.

Reddit을 스크랩하기 위해 우리는 PRO처럼 웹을 스크랩하는 데 도움이 되는 강력하고 유쾌한 API인 Page2API를 사용할 것입니다.

;

전제 조건



Reddit 게시물 스크래핑을 시작하려면 다음이 필요합니다.
  • A Page2API 계좌
  • 스크랩하려는 하위 레딧에 대한 링크입니다.
    스크래핑 프로세스를 더 쉽게 만들기 위해 HTML 구조가 더 간단한 이전 Reddit UI를 사용합니다.
    이 기사에서는 BMW 하위 레딧을 스크랩합니다.

  • ;

    Reddit 게시물을 긁는 방법



    가장 먼저 필요한 것은 하위 레딧 URL을 여는 것입니다.

    https://old.reddit.com/r/BMW/
    


    URL은 스크래핑을 수행하는 데 필요한 첫 번째 매개변수입니다.

    표시되는 페이지는 다음과 같아야 합니다.


    페이지 HTML을 검사하면 단일 결과가 다음과 같은 요소로 래핑되어 있음을 알 수 있습니다.


    이 페이지에서 각 Reddit 게시물의 다음 속성을 스크랩합니다.
  • 제목
  • URL
  • 썸네일
  • 제출됨
  • 저자
  • 작성자 URL
  • 댓글
  • 랭크
  • 점수

  • 이제 각 속성에 대한 선택자를 정의하겠습니다.

    /* Parent: */
    .thing[data-promoted=false]
    
    /* Title */
    a.title
    
    /* URL */
    a.title
    
    /* Thumbnail */
    a.thumbnail img
    
    /* Submitted */
    time
    
    /* Author */
    a.author
    
    /* Author URL */
    a.author
    
    /* Comments */
    (parent div, attribute: data-comments-count)
    
    /* Rank */
    (parent div, attribute: data-rank
    
    /* Score */
    (parent div, attribute: data-score
    


    이제 페이지 매김을 처리해 봅시다.
    다음 페이지 버튼을 클릭하여 Reddit 페이지를 반복합니다.

    다음 페이지로 이동하려면 페이지에 있는 경우 다음 페이지 링크를 클릭해야 합니다.

    document.querySelector('.next-button a').click()
    




    스크래핑은 페이지에 다음 링크가 있는 동안 계속되며 사라지면 중지됩니다.
    스크레이퍼의 중지 조건은 다음 자바스크립트 스니펫입니다.

    document.querySelector('.next-button a') === null
    


    이 하위 레딧에서 필요한 페이지를 스크랩하는 요청을 작성해 보겠습니다.

    다음 예는 Reddit.com에서 5페이지의 게시물을 스크랩하는 방법을 보여줍니다.

    페이로드는 다음과 같습니다.

    {
      "api_key": "YOUR_PAGE2API_KEY",
      "url": "https://old.reddit.com/r/BMW/",
      "merge_loops": true,
      "real_browser": true,
      "scenario": [
        {
          "loop": [
            { "wait_for": ".thing" },
            { "execute": "parse" },
            { "click": ".next-button a" }
          ],
          "stop_condition": "document.querySelector('.next-button a') === null",
          "iterations": 5
        }
      ],
      "parse": {
        "posts": [
          {
            "_parent": ".thing[data-promoted=false]",
            "title": "a.title >> text",
            "url": "a.title >> href",
            "thumbnail": "a.thumbnail img >> src",
            "submitted": "time >> datetime",
            "author": "a.author >> text",
            "author_url": "a.author >> href",
            "comments": "_parent >> data-comments-count",
            "rank": "_parent >> data-rank",
            "score": "_parent >> data-score"
          }
        ]
      }
    }
    


    파이썬 코드 예제

    import requests
    import json
    
    api_url = 'https://www.page2api.com/api/v1/scrape'
    
    The following example will show how to scrape 5 pages of posts from Reddit.com
    
    payload = {
      "api_key": "YOUR_PAGE2API_KEY",
      "url": "https://old.reddit.com/r/BMW/",
      "merge_loops": True,
      "real_browser": True,
      "scenario": [
        {
          "loop": [
            { "wait_for": ".thing" },
            { "execute": "parse" },
            { "click": ".next-button a" }
          ],
          "stop_condition": "document.querySelector('.next-button a') === null",
          "iterations": 5
        }
      ],
      "parse": {
        "posts": [
          {
            "_parent": ".thing[data-promoted=false]",
            "title": "a.title >> text",
            "url": "a.title >> href",
            "thumbnail": "a.thumbnail img >> src",
            "submitted": "time >> datetime",
            "author": "a.author >> text",
            "author_url": "a.author >> href",
            "comments": "_parent >> data-comments-count",
            "rank": "_parent >> data-rank",
            "score": "_parent >> data-score"
          }
        ]
      }
    }
    
    headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
    response = requests.post(api_url, data=json.dumps(payload), headers=headers)
    result = json.loads(response.text)
    
    print(result)
    


    결과

    {
      "result": {
        "posts": [
          {
              "title": "Thought you would enjoy this",
              "url": "https://old.reddit.com/r/BMW/comments/uu50bl/thought_you_would_enjoy_this/",
              "thumbnail": "https://b.thumbs.redditmedia.com/1OMVuKzvOeVi6IkOMc1K94HzPOLs3InozhCPlxU8K7E.jpg",
              "submitted": "2022-05-20T18:55:11+00:00",
              "author": "L9FanboyXD",
              "author_url": "https://old.reddit.com/user/L9FanboyXD",
              "comments": "206",
              "rank": "1",
              "score": "1234"
          },
          {
              "title": "Totalled..",
              "url": "https://old.reddit.com/r/BMW/comments/uu7yih/totalled/",
              "thumbnail": "https://b.thumbs.redditmedia.com/QQ7_MbJqhB5t4QfKJjbTFU4sEK0Cd9Cy5uFCSzzeLzM.jpg",
              "submitted": "2022-05-20T21:16:40+00:00",
              "author": "Conscious_Champion35",
              "author_url": "https://old.reddit.com/user/Conscious_Champion35",
              "comments": "130",
              "rank": "2",
              "score": "375"
          },
          {
              "title": "Joined the squad. Yes there was a flat bed at the dealer as I was closing this deal today.",
              "url": "https://www.reddit.com/gallery/uucgb5",
              "thumbnail": "https://b.thumbs.redditmedia.com/g8vAVq0N59R0a-IX1mBtM1YEy2gouhhGTTS7m4Nr8us.jpg",
              "submitted": "2022-05-21T01:16:08+00:00",
              "author": "restloy",
              "author_url": "https://old.reddit.com/user/restloy",
              "comments": "22",
              "rank": "3",
              "score": "157"
          }, ...
        ]
      }, ...
    }
    


    ;

    Reddit 댓글을 긁는 방법



    이전 단계의 게시물 URL을 열어야 합니다.

    이렇게 하면 브라우저 URL이 다음과 유사하게 변경됩니다.

    https://old.reddit.com/r/BMW/comments/uu50bl/thought_you_would_enjoy_this/
    


    이 URL은 Reddit 게시물 데이터와 댓글을 스크랩하는 데 필요한 첫 번째 매개변수입니다.

    표시되는 댓글 섹션은 다음과 같아야 합니다.


    이 페이지에서 다음 속성을 스크랩합니다.

    포스트 데이터:
  • 제목
  • 이미지

  • 댓글 데이터:
  • 저자
  • 작성자 URL
  • 게시됨
  • 점수
  • 아이디
  • 콘텐츠

  • 이제 각 속성에 대한 선택자를 정의하겠습니다.

    포스트 데이터

    /* Title */
    a.title
    
    /* Image */
    .media-preview-content img.preview
    


    댓글 데이터

    /* Parent */
    .entry
    
    /* Author */
    a.author
    
    /* Author URL */
    a.author
    
    /* Posted */
    time
    
    /* Score */
    .score.unvoted
    
    /* ID */
    input[name=thing_id]
    
    /* Content */
    .usertext-body
    


    Reddit 게시물 페이지에서 데이터를 스크랩할 요청을 준비할 때입니다.

    스크래핑 요청의 페이로드는 다음과 같습니다.

    {
      "api_key": "YOUR_PAGE2API_KEY",
      "url": "https://old.reddit.com/r/BMW/comments/urv3mr/i_saw_it_in_prague_the_red_is_much_prettier_in/",
      "parse": {
        "title": "a.title >> text",
        "image": ".media-preview-content img.preview >> src",
        "comments": [
          {
            "_parent": ".entry",
            "author": "a.author >> text",
            "author_url": "a.author >> href",
            "posted": "time >> datetime",
            "score": ".score.unvoted >> text",
            "id": "input[name=thing_id] >> value",
            "content": ".usertext-body >> text"
          }
        ]
      }
    }
    


    파이썬 코드 예시:

    import requests
    import json
    
    api_url = 'https://www.page2api.com/api/v1/scrape'
    payload = {
      "api_key": "YOUR_PAGE2API_KEY",
      "url": "https://old.reddit.com/r/BMW/comments/urv3mr/i_saw_it_in_prague_the_red_is_much_prettier_in/",
      "parse": {
        "title": "a.title >> text",
        "image": ".media-preview-content img.preview >> src",
        "comments": [
          {
            "_parent": ".entry",
            "author": "a.author >> text",
            "author_url": "a.author >> href",
            "posted": "time >> datetime",
            "score": ".score.unvoted >> text",
            "id": "input[name=thing_id] >> value",
            "content": ".usertext-body >> text"
          }
        ]
      }
    }
    
    headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
    response = requests.post(api_url, data=json.dumps(payload), headers=headers)
    result = json.loads(response.text)
    
    print(result)
    


    결과:

    {
      "result": {
        "title": "I saw it in prague. the red is much prettier in real life",
        "image": "https://preview.redd.it/91x8qz36f3091.jpg?width=1023&auto=png&s=9c0aced50d6743989f053cf9cc78c896f928d8a7",
        "comments": [
          {
            "author": "DarkMeta81",
            "author_url": "https://old.reddit.com/user/DarkMeta81",
            "posted": "2022-05-17T20:12:31+00:00",
            "score": "15 points",
            "id": "t1_i8zlp77",
            "content": "i was on vacation and prague is full of beautiful bmw this m5 is great"
          },
          {
            "author": "Id-atl",
            "author_url": "https://old.reddit.com/user/Id-atl",
            "posted": "2022-05-18T01:06:15+00:00",
            "score": "5 points",
            "id": "t1_i90on16",
            "content": "Wow imagine being in Prague ripping this around!"
          }, ...
        ]
      }, ...
    }
    


    ;

    결론



    그게 다야!

    이 기사에서는 모든 번거로움을 처리하고 필요한 데이터를 쉽게 얻을 수 있는 웹 스크래핑 API인 Page2API를 사용하여 Reddit.com에서 데이터를 스크랩하는 방법을 배웠습니다.

    원본 기사는 여기에서 찾을 수 있습니다.
    https://www.page2api.com/blog/how-to-scrape-reddit/

    좋은 웹페이지 즐겨찾기