【Pythonスクレイピング】アニメダウンロード自動化

ITエンジニア

毎日見たいアニメやドラマを探して、最新話をダウンロードする日課がありますでしょうか。
一日数回チェックすることもあるし、最新話は何話かを確認しないと行けないし、時々見落とすこともあります。

この日課から開放し、機械に任せて自動的にダウンロードすることを実現しました。
この記事は自分作ったプログラムを公開し、解析します。それをベースに誰でも自分用のダウンロードプログラムを作ることをできます。

この記事のポイント

●プログラムの特徴
●プログラム公開
●自分用のカスタマイズ方法

プログラムの特徴

このプログラムができることは:
1時間毎に自動起動し、指定のサイトから指定のキーワードで最新話のTorrentファイルをダウンロードします。

BTソフト(uTorrent)がフォルダを監視し、Torrentファイルがあれば、自動ダウンロードします。Torrentファイルを自動削除します。

プログラム公開

早速、プログラムを公開します。

プログラム内容

download_rss.py:

import os, time, requests, urllib, re
from bs4 import BeautifulSoup

target_url = 'https://share.dmhy.org/topics/list/sort_id/2'
# 保存先フォルダ
save_dir = 'c:\\WorkSpace\\Chrome\\'

html = requests.get(target_url).text
soup = BeautifulSoup(html, 'html5lib')

# ダウンロードのメイン処理
def download_torrents():
    
    html = requests.get(target_url).text
    # 解析してURLの一覧を取得
    urls = get_torrent_urls(html)
    # URLの一覧をダウンロード
    go_download(urls)

# listに合致かを判断
def contents_confirm(content):
    with open(r'c:\WorkSpace\publicTools\scraping\pattern.txt', encoding='utf8') as f:
        text = f.read().strip()
        lines = text.split("\n")
        for row in lines:
            # print(row)
            result = re.match(row, content)
            # print(result)
            if result:
                return True
    return False


# HTMLからURL一覧を取得
def get_torrent_urls(html):
    # HTMLを解析
    soup = BeautifulSoup(html, 'html5lib')
    res = []
    for link in soup.select('#topic_list > tbody > tr > td.title > a'): 
            text = link.getText()
            # print(text)

            if(contents_confirm(text.strip())):
                subLink = link.get('href')
                # URLを絶対パスに変換
                url = urllib.parse.urljoin(target_url, subLink)
                print(url)
                # URLからHTML解析し、TorrentのURL取得
                subhtml = requests.get(url).text
                subsoup = BeautifulSoup(subhtml, 'html5lib')
                torrentUrltmp = subsoup.select_one('#tabs-1 > p:nth-child(1) > a')
                torrentUrl = urllib.parse.urljoin(target_url, torrentUrltmp.get('href'))
                print(torrentUrl)
                res.append(torrentUrl)
    return res

# 連続でURL一覧をダウンロード
def go_download(urls):

    if not os.path.exists(save_dir):
        os.mkdir(save_dir)
    for url in urls:
        fname = os.path.basename(url)
        save_file = save_dir + '/' + fname
        r = requests.get(url)
        with open(save_file, 'wb') as fp:
            fp.write(r.content)
            print("save:", save_file)
        time.sleep(1) # 重要

if __name__ == '__main__':
    download_torrents()

pattern.txt:

.*[NC-Raws] 轉生成蜘蛛又怎樣!(僅限港澳台地區).*1080p.*
​.*c.c動漫.*Boruto -Naruto Next Generations.*
.*DMHY.*Black_Clover.*
.*Skymoon-Raws.*One Piece.*正式版本.*
.*NC-Raws.*關於我轉生變成史萊姆這檔事 第二季(僅限台灣地區).*
.*NC-Raws.*記錄的地平線 圓桌崩壞(僅限港澳台地區).*
.*NC-Raws.*進擊的巨人 The Final Season(僅限港澳台地區).*

最新のソースはGitHubからダウンロードできます。

解説

使っている技術:Python、スクラピング(BeautifulSoup)、正規表現

target_urlでダウンロードするサイトを指定。

pattern.txtに見たいアニメのキーワードを正規表現で定義、このファイルを都度更新します。

Pythonの基礎やスクラピングの技術を解説しませんが、知りたい方は下記の本をご参考ください。自分がこの本をきっかけにこのプログラム作りました。

シゴトがはかどる Python自動処理の教科書

Winタスクスケジューラ登録

1時間毎に自動実行するには、タスクスケジューラに登録する必要で、Win10の登録方法を紹介します。

タスクスケジューラ起動

タスクスケジューラ設定

タスク作成:

トリガー設定:1時間毎に実行

起動プログラムを指定:

プログラム/スクリプト:C:\Users\syasi\anaconda3\python.exe ※Python実行パス
引数の追加:download_rss.py ※Pythonファイル名
開始:c:\WorkSpace\publicTools\scraping\ ※Pythonファイルのパス

BTソフトの設定

utorrent2.2.1の自動化設定方法を紹介します。
最新バージョンは広告がうるさいのため、安定した2.2.1を使用しています。

監視したフォルダを指定すればOKです。後utorrentをバックで起動すればOKです。

自分用のカスタマイズ方法

環境準備

Pythonの環境はAnaconda利用しています。
コードの編集はVSCode利用しています。

注意点:VscodeでPython実行するとき、環境変数にPath指定しないとSSLErrorになります。
Win10の環境変数方法:

自分のPathに赤枠の設定を追加してください。

%USERPROFILE%\Anaconda3
%USERPROFILE%\Anaconda3\scripts
%USERPROFILE%\Anaconda3\Library\bin

select内容を調査方法

ChromeのF12で開発モードを開き

Copy selectorを選択すれば、下記のように該当箇所の位置をわかります。かなり便利です。

#tabs-1 > p:nth-child(1) > a

まとめ

すべての人は1日24時間しかありません。日々やっていることを短縮できるか、無駄がないか、自動化できるかをずっと考えています。

役に立ったら嬉しいです。不明点があればコメント下さい。

コメント

タイトルとURLをコピーしました