
Reddit은 각 하위 레딧에 대한 JSON 피드를 제공합니다. 다음은 원하는 하위 레딧에서 게시물 목록을 다운로드하고 구문 분석하는 Bash 스크립트를 만드는 방법입니다. 이것은 Reddit의 JSON 피드로 할 수있는 일 중 하나입니다.
컬 및 JQ 설치
우리는 사용할 것입니다 curl Reddit에서 JSON 피드를 가져오고 jq JSON 데이터를 구문 분석하고 결과에서 원하는 필드를 추출합니다. 다음 두 가지 종속성을 설치하십시오. apt-get 우분투 및 기타 데비안 기반 Linux 배포판에서. 다른 Linux 배포판에서는 배포판의 패키지 관리 도구를 대신 사용하십시오.
sudo apt-get install curl jq
Reddit에서 일부 JSON 데이터 가져 오기
데이터 피드가 어떻게 보이는지 봅시다. 사용하다 curl MildlyInteresting 서브 레딧에서 최신 게시물을 가져 오려면 :
curl -s -A “reddit scraper example” https://www.reddit.com/r/MildlyInteresting.json
URL 앞에 옵션이 어떻게 사용되는지 참고하십시오. -s Reddit 서버의 데이터를 제외하고 출력이 표시되지 않도록 컬이 자동 모드로 실행됩니다. 다음 옵션과 그 뒤에 오는 매개 변수 -A “reddit scraper example” Reddit가 데이터에 액세스하는 서비스를 식별하는 데 도움이되는 사용자 정의 사용자 에이전트 문자열을 설정합니다. Reddit API 서버는 사용자 에이전트 문자열을 기반으로 속도 제한을 적용합니다. 사용자 정의 값을 설정하면 Reddit이 요금 한도를 다른 발신자와 분리하여 HTTP 429 요금 한도 초과 오류가 발생할 가능성을 줄입니다.
출력은 터미널 창을 채우고 다음과 같아야합니다.

출력 데이터에는 많은 필드가 있지만 제목, 퍼머 링크 및 URL 만 관심이 있습니다. https://github.com/reddit-archive/reddit/wiki/JSON Reddit의 API 설명서 페이지에서 전체 유형 및 해당 필드 목록을 볼 수 있습니다.
JSON 출력에서 데이터 추출
출력 데이터에서 Title, Permalink 및 URL을 추출하여 탭으로 구분 된 파일에 저장하려고합니다. 우리는 같은 텍스트 처리 도구를 사용할 수 있습니다 sed 과 grep 이지만 JSON 데이터 구조를 이해하는 다른 도구가 있습니다. jq . 첫 번째 시도에서는 출력물을 예쁘게 인쇄하고 색상으로 구분하는 데 사용하겠습니다. 이전과 동일한 호출을 사용하지만 이번에는 출력을 jq JSON 데이터를 구문 분석하고 인쇄하도록 지시하십시오.
curl -s -A “reddit scraper example” https://www.reddit.com/r/MildlyInteresting.json | jq .
명령 뒤에 오는 기간에 유의하십시오. 이 표현식은 단순히 입력을 구문 분석하여 그대로 인쇄합니다. 출력물은 형식이 좋고 색상으로 표시됩니다.

Reddit에서 얻은 JSON 데이터의 구조를 살펴 보겠습니다. 근본 결과는 종류와 데이터의 두 가지 속성이 포함 된 개체입니다. 후자는 children이 하위 레딧에 대한 게시물 배열을 포함합니다.
배열의 각 항목은 kind와 data라는 두 필드도 포함하는 객체입니다. 우리가 잡으려는 속성은 데이터 객체에 있습니다. jq 입력 데이터에 적용 할 수있는 표현식을 기대하고 원하는 출력을 생성합니다. 계층 구조와 배열 멤버 자격 및 데이터 변환 방법에 대해 내용을 설명해야합니다. 올바른 표현으로 전체 명령을 다시 실행 해 보겠습니다.
curl -s -A “reddit scraper example” https://www.reddit.com/r/MildlyInteresting.json | jq ‘.data.children | .() | .data.title, .data.url, .data.permalink’
출력에는 제목, URL 및 Permalink가 각각 고유 한 줄에 표시됩니다.

에 들어가 보자 jq 우리가 명령 :
jq ‘.data.children | .() | .data.title, .data.url, .data.permalink’
이 명령에는 두 개의 파이프 기호로 구분 된 세 가지 표현식이 있습니다. 각 식의 결과는 다음 평가로 전달되어 추가 평가를받습니다. 첫 번째 표현식은 Reddit 리스팅의 배열을 제외한 모든 것을 걸러냅니다. 이 출력은 두 번째 표현식으로 파이프되고 배열로 강제 적용됩니다. 세 번째 표현식은 배열의 각 요소에 작용하고 세 가지 특성을 추출합니다. 더 자세한 정보 jq 그 표현 구문은 jq의 공식 매뉴얼에서 찾을 수 있습니다.
스크립트에 모두 통합
API 호출과 JSON 사후 처리를 원하는 게시물이 포함 된 파일을 생성하는 스크립트로 결합 해 보겠습니다. / r / MildlyInteresting뿐만 아니라 모든 하위 레딧에서 게시물을 가져 오는 기능도 추가 할 예정입니다.
편집기를 열고이 스 니펫의 컨텐츠를 scrape-reddit.sh라는 파일로 복사하십시오.
#!/bin/bash
if ( -z "$1" )
then
echo "Please specify a subreddit"
exit 1
fi
SUBREDDIT=$1
NOW=$(date +"%m_%d_%y-%H_%M")
OUTPUT_FILE="${SUBREDDIT}_${NOW}.txt"
curl -s -A "bash-scrape-topics" https://www.reddit.com/r/${SUBREDDIT}.json |
jq '.data.children | .() | .data.title, .data.url, .data.permalink' |
while read -r TITLE; do
read -r URL
read -r PERMALINK
echo -e "${TITLE}t${URL}t${PERMALINK}" | tr --delete " >> ${OUTPUT_FILE}
done
이 스크립트는 먼저 사용자가 하위 레딧 이름을 제공했는지 확인합니다. 그렇지 않으면 오류 메시지와 0이 아닌 리턴 코드와 함께 종료됩니다.
그런 다음 첫 번째 인수를 하위 레딧 이름으로 저장하고 출력이 저장 될 날짜 스탬프 파일 이름을 작성합니다.
행동은 언제 시작 curl 사용자 지정 헤더와 스크래핑 할 하위 레딧의 URL과 함께 호출됩니다. 출력은 파이프 jq 구문 분석되고 제목, URL 및 영구 링크의 3 개 필드로 축소되었습니다. 이러한 행은 한 번에 하나씩 읽고 read 명령을 사용하여 while 루프 내에서 변수에 저장되어 더 이상 읽을 행이 없을 때까지 계속됩니다. inner while 블록의 마지막 줄은 탭 문자로 구분 된 세 개의 필드를 에코 한 다음 tr 큰 따옴표를 제거 할 수 있습니다. 그런 다음 출력이 파일에 추가됩니다.
이 스크립트를 실행하기 전에 실행 권한이 부여되었는지 확인해야합니다. 사용 chmod 이 권한을 파일에 적용하는 명령 :
chmod u+x scrape-reddit.sh
마지막으로 하위 이름으로 스크립트를 실행하십시오.
./scrape-reddit.sh MildlyInteresting
출력 파일은 동일한 디렉토리에 생성되며 그 내용은 다음과 같습니다.

각 줄에는 탭 문자로 구분 된 세 개의 필드가 있습니다.
더 나아 가기
Reddit은 흥미로운 콘텐츠와 미디어의 금광이며 JSON API를 사용하여 쉽게 액세스 할 수 있습니다. 이제이 데이터에 액세스하고 결과를 처리 할 수있는 방법이 생겼습니다.
- / r / WorldNews에서 최신 헤드 라인을 가져 와서 알림 보내기를 사용하여 데스크탑으로 보내십시오.
- / r / DadJokes의 최고의 농담을 시스템의 Message-Of-The-Day에 통합
- / r / aww에서 오늘 최고의 사진을 찍어 데스크탑 배경으로 만드십시오.
이 모든 것은 제공된 데이터와 시스템에있는 도구를 사용하여 가능합니다. 행복한 해킹!








