토렌트 사이트에서 RSS feed 생성


전 Gsuite를 사용하고 있어서 요즘 부담 없이 파일을 받고 있습니다. 받고자 하는 사이트들을 RSS로 만들어서 사용하고 있는데, 몇 개 작업하다 보니 대게 비슷하여 이걸 일반화 시켜보았습니다.

요즘 토렌트 사이트들 열에 아홉은 gnuboard를 사용하고, 세부 화면에서 magnet을 제공합니다. 이를 이용하는 방식으로 gnuboard 사용한 사이트를 게시판 기준으로 rss.xml 파일을 생성하고 설정에 따라 자막 파일 등을 바로 다운로드합니다.

※ 토렌트 목록 화면에서 주소창에 /bbs/board.php?bo_table= , 다운로드 링크에 /bbs/download.php 이 있는 사이트가 gnuboard를 이용한 사이트입니다. ※ Synology에 적용하는 방식으로 설명합니다.

이전 방식과 차이점

  • 이전에는 RSS를 요청할 때 생성하는 반면 이 방식은 파일을 먼저 만들어 놓습니다. 따라서 작업 스케줄러나 crontab 등을 이용해야 합니다.
  • 크롤링에 selenium을 사용합니다. headless-browser라고 생각하시면 되는데, 직접 브라우저를 통해 사이트를 방문하는 것과 동일하나 눈에 보이지 않는 브라우저를 사용하는 방식입니다. 이전에는 사이트를 긁어 올 때 쿠키나 리퍼러 등을 설정해줘야 하는 경우가 있었는데 selenium을 사용하면 신경 쓸 필요가 없습니다. 사용한 가장 큰 이유는 cloudflare를 이용하는 사이트를 긁어오기 위함입니다.

    driver로는 chrome, firefox도 있으나 synology에서는 docker 버전 phantomjs를 사용했습니다. 타 OS에서 사용 시 드라이버만 변경하면 됩니다.

  • python 2.7 기준으로 작성되었습니다.

설치, 적용 방법, github를 이용한 배포 순으로 설명드리겠습니다. 최대한 자세히 설명하고자 하지만 아무래도 코드를 수정해야 하기에 초보자(?)분들은 어렵게 느껴지실 겁니다. 또 제 synology은 이미 세팅이 끝난 거라서 미쳐 설명하지 못한 내용이 있을 수도 있으니 빠진 부분이 있을 수도 있겠네요.


1. 실행환경 설치

  • PhantomJS 설치
    • docker에서 phantomjs로 검색하여 wernight/phantomjs 다운로드 markdown-img-paste-20180830224621105
    • 이미지 생성 및 실행 root@soju6jan:~# docker run -d -p 8910:8910 wernight/phantomjs phantomjs --webdriver=8910
    • docker 비디오 형식이 이미지가 만들어지고 실행상태가 됩니다. (이름은 랜덤) markdown-img-paste-20180830224741322
    • 브라우저에서 synology IP:8910 접속하여 그림과 같이 나오면 설치가 완료된 상태입니다. markdown-img-paste-20180830225442890
  • python 2.7 python 2.7은 synology에 기본적으로 설치되어 있습니다. (기억이 잘 안 나네요)
# root 권한
soju6jan@soju6jan:~$ sudo -i
Password:

# 적당한 곳에 폴더를 하나 만듭니다.
root@soju6jan:~# cd /volume1/web/
root@soju6jan:/volume1/web# mkdir makerss
root@soju6jan:/volume1/web# cd makerss/

#python 설치여부 확인
root@soju6jan:/volume1/web/makerss# python
Python 2.7.12 (default, Jul  3 2018, 19:55:45)
[GCC 4.9.3 20150311 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

# pip 를 설치합니다. 설치된 상태면 패스
root@soju6jan:/volume1/web/makerss# wget https://bootstrap.pypa.io/get-pip.py
--2018-08-30 12:41:20--  https://bootstrap.pypa.io/get-pip.py
Resolving bootstrap.pypa.io... 151.101.228.175, 2a04:4e42:36::175
Connecting to bootstrap.pypa.io|151.101.228.175|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1642522 (1.6M) [text/x-python]
Saving to: 'get-pip.py'

get-pip.py          100%[===================>]   1.57M  3.80MB/s    in 0.4s

2018-08-30 12:41:21 (3.80 MB/s) - 'get-pip.py' saved [1642522/1642522]

# pip 설치
root@soju6jan:/volume1/web/makerss# python get-pip.py
Collecting pip
  Downloading https://files.pythonhosted.org/packages/5f/25/e52d3f31441505a5f3af 41213346e5b6c221c9e086a166f3703d2ddaf940/pip-18.0-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 953kB/s
Collecting setuptools
  Downloading https://files.pythonhosted.org/packages/66/e8/570bb5ca88a8bcd2a1db 9c6246bb66615750663ffaaeada95b04ffe74e12/setuptools-40.2.0-py2.py3-none-any.whl  (568kB)
    100% |████████████████████████████████| 573kB 1.4MB/s
Collecting wheel
  Downloading https://files.pythonhosted.org/packages/81/30/e935244ca6165187ae8b e876b6316ae201b71485538ffac1d718843025a9/wheel-0.31.1-py2.py3-none-any.whl (41kB )
    100% |████████████████████████████████| 51kB 1.4MB/s
Installing collected packages: pip, setuptools, wheel
Could not install packages due to an EnvironmentError: [Errno 13] Permission den ied: '/usr/lib/python2.7/site-packages/pip-18.0.dist-info'
Consider using the `--user` option or check the permissions.

# selenium 패키지 설치
root@soju6jan:/volume1/web/makerss#  pip install selenium
Collecting selenium
  Downloading https://files.pythonhosted.org/packages/b8/53/9cafbb616d20c7624ff3 1bcabd82e5cc9823206267664e68aa8acdde4629/selenium-3.14.0-py2.py3-none-any.whl (8 98kB)
    100% |████████████████████████████████| 901kB 901kB/s
Collecting urllib3 (from selenium)
  Downloading https://files.pythonhosted.org/packages/bd/c9/6fdd990019071a4a32a5 e7cb78a1d92c53851ef4f56f62a3486e6a7d8ffb/urllib3-1.23-py2.py3-none-any.whl (133k B)
    100% |████████████████████████████████| 143kB 1.3MB/s
Installing collected packages: urllib3, selenium
Successfully installed selenium-3.14.0 urllib3-1.23

# 4개의 파일을 받습니다.
# https://github.com/soju6jan/soju6jan.github.io/tree/master/makerss 에서 다운받으신 후 폴더에 넣으셔도 됩니다.
root@soju6jan:/volume1/web/makerss# wget https://soju6jan.github.io/makerss/makerss_main.py
root@soju6jan:/volume1/web/makerss# wget https://soju6jan.github.io/makerss/makerss_setting.py
root@soju6jan:/volume1/web/makerss# wget https://soju6jan.github.io/makerss/makerss.sh
root@soju6jan:/volume1/web/makerss# wget https://soju6jan.github.io/makerss/commit.sh

# 권한 변경
root@soju6jan:/volume1/web/makerss# chmod 777 *

# 실행
root@soju6jan:/volume1/web/makerss# python makerss_main.py
.....

# 정상적으로 실행이 끝나면 샘플 rss파일이 하나 만들어져 있어야합니다.
root@soju6jan:/volume1/web/makerss#  cat torrentboza_ani.xml
....

2. 토렌트 사이트 적용

이제 원하는 사이트를 적용하는 방법입니다. makerss_setting.py 파일을 문서편집기로 엽니다.

SITE_LIST = [
	{
		'TORRENT_SITE_TITLE': 'torrentboza',
		'TORRENT_SITE_URL': 'https://torrentboza.com',
		'BO_TABLE_LIST': ['ani'],
		'MAX_PAGE': 1,
		'XPATH_LIST_TAG'      : '//*[@id="fboardlist"]/div[1]/ul/li[%s]/div[2]/a',
	},
]

주석 처리(“”” “”” ) 된 곳에 몇 가지 샘플이 더 있습니다. 사이트별-게시판별로 세팅만 해주면 됩니다.

  • TORRENT_SITE_TITLE : 사이트 이름입니다. 파일명이 됩니다.
  • TORRENT_SITE_URL : 토렌트 사이트 주소
  • BO_TABLE_LIST : bo_table= 뒤에 오는 게시판별 ID입니다. 여러 개 할 경우 [‘이름’, ‘이름 2’, ‘이름 3’] 형식으로 추가할 수 있습니다.
  • MAX_PAGE : 최대 탐색할 페이지 값입니다. 1이면 첫 페이지만 합니다.
  • XPATH_LIST_TAG : 게시글 목록 화면에서 게시글의 위치를 나타나는 xpath
예제) downrose.com에서 애니메이션 게시판

url : https://downrose.com/bbs/board.php?bo_table=ANIMATION

SITE_LIST = [
	{
		'TORRENT_SITE_TITLE': 'downrose',
		'TORRENT_SITE_URL': 'https://downrose.com',
		'BO_TABLE_LIST': ['ANIMATION'],
		'MAX_PAGE': 1,
		'XPATH_LIST_TAG'      : '//*[@id="fboardlist"]/div[1]/table/tbody/tr[%s]/td[4]/a',
	},
]
XPATH_LIST_TAG 찾기
  • 크롬 브라우저에서 첫 번째 게시물 제목에 마우스를 위치시키고 우 클릭. 메뉴에서 검사를 누릅니다. markdown-img-paste-20180830225455648
  • 크롬이 개발자 모드로 변경되고 오른쪽에 HTML 코드가 나오면서 첫 게시물과 관련된 태그가 음영 처리되어 있습니다. 이때 모든 사이트가 항상 A 태그에 있지는 않습니다. TR 태그나 LI 태그에 있을 수도 있는데 위아래에 A 태그가 항상 있습니다. 이 A 태그에서 마우스 우 클릭 Copy -> Copy XPath를 클릭합니다. markdown-img-paste-20180830225500424
  • 문서 편집기에서 Ctrl+V 하면 아래처럼 xpath가 나옵니다. //*[@id="fboardlist"]/div[1]/table/tbody/tr[1]/td[4]/a 두 번째 게시물에서 이 작업을 한 번 더 해주면 //*[@id="fboardlist"]/div[1]/table/tbody/tr[2]/td[4]/a 이렇게 나오는데 첫 번째와 두 번째 게시물의 차이는 tr[1] tr[2]입니다. 이 숫자 부분만 %s 변경해주면 XPATH_LIST_TAG 값이 됩니다. XPATH_LIST_TAG = '//*[@id="fboardlist"]/div[1]/table/tbody/tr[%s]/td[4]/a'
  • 저장 후 python makerss_main.py를 실행해 주면 downrose_ANIMATION.xml 파일이 생성됩니다. markdown-img-paste-2018083022550898

  • 이 게시판은 자막 파일도 같이 제공합니다. DOWNLOAD_FILE = 'ON' 추가하시면 폴더에 파일을 다운로드합니다. markdown-img-paste-20180830225513241
  • 갤러리형 게시판도 동일한 방법으로 적용 가능합니다. 같은 사이트 최신 영화 게시판의 경우 첫 번째 : //*[@id="fboardlist"]/div[1]/div/div/div[2]/strong/a 두 번째 : //*[@id="fboardlist"]/div[2]/div/div/div[2]/strong/a XPATH_LIST_TAG : '//*[@id="fboardlist"]/div[%s]/div/div/div[2]/strong/a'

Advanced

  • 제가 주로 사용하는 사이트만 테스트했고, 사이트별로 제각각이기에 잘 안 될 수도 있습니다.
  • main_setting.py 하단의 GetList 함수만 수정하시면 검색어 처리나, gnuboard 이외의 사이트도 가능하니라 생각됩니다.
  • 첫 번째 두 번째 게시글의 차이가 2 이상 나면 STEP : 2처럼 차이나는 값이 추가하면 좀 더 빨리 탐색합니다.
  • 토렌트하자의 경우 magnet 값이 A 태그에 없습니다. 제가 사용하기에 예외적으로 추가했으니 샘플에서 복사하셔서 사용하시기 바랍니다.
  • 파일 다운로드는 A 태그로 직접 받을 수 있는 것만 가능합니다. 티프리카 처럼 외부 사이트로 간다든지, javascript로 처리된 경우에는 직접 코드를 수정하셔야 합니다.

###

  1. Github를 이용한 배포 앞서 생성한 xml 파일을 웹 서버에 올리고 DownloadStation에 등록하면 바로 사용 가능합니다. 저는 synology 웹서버에 올리지 않고 github 올려서 공유 중인데 xml 생성 후 자동으로 올리는 방법을 알려드리겠습니다. Github는 무료 웹호스팅을 제공하는데 용량이 1GB / 월 트래픽 100GB를 제공합니다. 장점으로는 git 명령어로 ssh에서 자동화 시킬 수 있는 것과 절대 망할 일이 없다는 점 정도로 들 수 있겠네요. 단점으로는 동적 페이지는 작성할 수 없습니다.
  • https://opentutorials.org/course/3084/18891 이 글을 따라 자신의 웹 페이지를 생성해줍니다.
  • 패키지 센터에서 Git Server를 설치합니다. ```

    적당한 곳에 폴더 생성

    root@DiskStation:/volume1/video# mkdir git root@DiskStation:/volume1/video# cd git

키 발급.

root@DiskStation:/volume1/video/git# ssh-keygen -t rsa -b 4096 -C “soju6jan@gmail.com” Generating public/private rsa key pair.

#엔터 Enter file in which to save the key (/root/.ssh/id_rsa):

자동로그인을 위해 암호도 엔터

Enter passphrase (empty for no passphrase): Enter same passphrase again:

공개키 내용을 복사합니다.

root@DiskStation:/volume1/video/git# cat /root/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADA……………

 + github에 공개 key 등록
github에 로그인 후 상단 우측 아이콘 클릭 -> Settings 클릭 -> 좌측 SSH and GPG keys 클릭 -> New SSH key 클릭
![markdown-img-paste-2018083022552422](https://i.imgur.com/BznhVR8.png)

 + SSH에서 복사한 내용을 Key 란에 입력 후 Add SSH key 클릭하여 등록
![markdown-img-paste-20180830225528859](https://i.imgur.com/leFtGmd.png)

 + Clone or download 버튼을 누르고 git@github,..... 내용을 복사합니다.
![markdown-img-paste-2018083022553614](https://i.imgur.com/VHZLrUg.png)

+ SSH에서 git 설정

자신의 git clone

root@DiskStation:/volume1/video/git# git clone git@github.com:soju6jan/soju6jan.github.io.git Cloning into ‘soju6jan.github.io’… The authenticity of host ‘github.com (192.30.255.112)’ can’t be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added ‘github.com,192.30.255.112’ (RSA) to the list of known hosts. Enter passphrase for key ‘/root/.ssh/id_rsa’: remote: Counting objects: 3398, done. remote: Compressing objects: 100% (67/67), done. remote: Total 3398 (delta 45), reused 57 (delta 19), pack-reused 3312 Receiving objects: 100% (3398/3398), 151.26 MiB | 745.00 KiB/s, done. Checking out files: 100% (28/28), done.

git 이름, 이메일을 설정

root@DiskStation:/volume1/video/git# cd soju6jan.github.io/ root@DiskStation:/volume1/video/git# git config user.email “이메일” root@DiskStation:/volume1/video/git# git config user.name “이름”

commit.sh 파일을 복사해줍니다.

root@DiskStation:/volume1/video/git/soju6jan.github.io# mv ../../makerss.sh .


+ commit.sh 파일을 열어서 4번째 줄 cd에 git 경로를 수정하고 저장합니다.

#!/bin/bash export LANG=en_US.utf8 NowDate=$(date +%Y%m%d)-$(date +%H%M) cd /volume1/video/git/soju6jan.github.io git add * git commit -m $NowDate git push


+ commit.sh 파일을 실행 했을 때 아래처럼 나오면 정상입니다.

root@DiskStation:/volume1/video/git/soju6jan.github.io# ./commit.sh On branch master Your branch is up-to-date with ‘origin/master’. nothing to commit, working tree clean Everything up-to-date


+ 이제 makerss 폴더의 makerss.sh 파일을 열고 자신의 경로에 맞게 수정해줍니다.

#!/bin/sh

자산의 경로에 맞게 path를 수정합니다.

PATH_MAKERSS=/volume1/video/makerss PATH_GIT=/volume1/video/git/soju6jan.github.io

cd $PATH_MAKERSS python makerss_main.py

생성된 xml 파일 git폴더에 복사 $PATH_GIT/rss 처럼 폴더에 복사가능

mv $PATH_MAKERSS/*.xml $PATH_GIT

commit 실행

$PATH_GIT/commit.sh


+ makerss.sh 실행

root@DiskStation:/volume1/video/makerss# ./makerss.sh ```

한 번 실행해봅니다. 정상적으로 끝나면 자신의 git에 xml 파일이 올려져 있어야 하며 https://soju6jan.github.io/downrose_ANIMATION.xml 와 같은 주소를 입력하면 정상적으로 xml 파일이 나옵니다.

  • makerss.sh 파일을 작업 스케줄러에 등록합니다.
  • 다운로드 스테이션에서 github 경로로 등록하여 사용하면 됩니다.





© 2018. by soju6jan