IT技術で仕事を減らしたい!

ITエンジニアのメモ+α

Python pytubeでyoutube動画情報取得

どうも、nippa です。

今回はネタ記事で、たまたま見つけた pytube というライブラリを紹介したいと思います。

pytube は 軽量なライブラリで、ライブラリ依存性がない youtube の動画情報をするためのライブラリになります。

動画のダウンロードは法律に触れる可能性があります。また、Youtube利用規約を守って利用ください。くれぐれもご注意ください。

pytube 公式

環境

  • macOS 12.5
  • python3.9
  • pytube 12.1

ライブラリのインストール

  • pip
pip install pytube
  • poetry
poetry install pytube

動画の情報取得

使い方、以下のような形で情報を取得することができます。

from pytube import YouTube

YouTube("Youtube URL").streams.first()

first()で streams(再生設定の種類)の最初のものを指定して、情報を取得しています。

stream の確認

取得可能なストリートを確認します。

from pytube import YouTube

streams = YouTube(
    "Youtube URL"
).streams

for stream in streams:
    print(stream)

上記で、指定した Youtube 動画のストリームが確認でき、前節での first()は表示されたリストの最初のものを示しています。

first()の代わりに last()を利用すると、最後に表示されるストリームを指定することができます。

stream のフィルタリング

filter()を使って、オプションを1つ以上指定することで Stream をフィルタリングすることができます。

from pytube import YouTube

streams = YouTube("Youtube URL").streams

print("all stream")
for stream in streams:
    print(stream)

print("filter by resolution")
for stream in streams.filter(res="1080p"):
    print(stream)

print("filter by fps")
for stream in streams.filter(res="24fps"):
    print(stream)

print("filter by audio type")
for stream in streams.filter(only_audio=True):
    print(stream)

print("filter by mime_type")
for stream in streams.filter(mime_type="video/mp4"):
    print(stream)

print("filter by adaptive(DASH stream)")
for stream in streams.filter(adaptive=True):
    print(stream)

フィルターの種類はいろいろありますが、ソースコードを見るのが一番はやいです。

stream を指定して動画の情報取得

ストリームの詳細を表示すると、各ストリームに itag が振られています。

get_by_itag に int 型で引数を与えると、個別ストリームを取り出すことができます。

from pytube import YouTube

streams = YouTube("Youtube URL").streams
stream = streams.get_by_itag(22)
print(stream)

Playlist の情報取得

play list に登録されている動画情報を取得できます。

from pytube import Playlist

play_list = Playlist("Youtube Play List")

for video in play_list.videos:
    print(f"title: {video.title} URL: {video.watch_url}")

上では、プレイリストの各動画のタイトルと URL を表示しています。

Chanel の情報取得

channel に登録されている動画の情報を取得できます。

from pytube import Channel

channel = Channel("https://www.youtube.com/c/ProgrammingKnowledge")

print(f"チャンネルタイトル: {channel.title}")

for video in channel.videos:
    print(f"title: {video.title} URL: {video.watch_url}")

上ではチャンネルの動画すべてのタイトルとURLを表示しています。

Youtube の検索結果の取得

Search クラスを利用して検索結果の取得ができます。

from pytube import Search

search = Search("検索ワード")

print(len(search.results))
videos, next_continuation = search.fetch_and_parse()
for video in videos:
    print(video.watch_url)

next_continuationを指定することで、次の検索結果を fetch できます。

感想

今回 pytube についてご紹介しました。

動画情報収集をこのライブラリのみでできるのでデータ収集には非常に便利かもしれません。

ダウンロード機能もありますが、法律や利用規約に触れるため今回は紹介しませんでした。

youtubeの規約や動画の著作権がありますので、利用する場合はご注意ください。

ではでは、また次回。

Docker MongoDBの構築

どうも、nippa です。

NoSQL のデータベースを利用したく、MongoDB を docker で構築しようと思います。

今回はMongoDB の公式 imageを利用します。

環境

  • macOS 11.6
  • Docker 20.10
  • MongoDB 5.0.10

ディレクトリ構造(フォルダ構成)

今回のディレクトリ構造(フォルダ構成)は以下のようになっています。

├── docker
│   └── mongodb
│       ├── configdb
│       └── db
└── docker-compose.yml

local のdocker/mongodb/dbを mongo DB のデータを保存するためのディレクトリになっています。

docker-compose ファイル

mongo データベースサーバ + mongo-express の構成になっています。

docker-compose.ymlの内容は以下の通りです。

version: "3"
services:
  mongodb:
    image: mongo
    restart: always
    container_name: mongodb
    hostname: mongodb
    ports:
      - 27017:27017
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=example
    volumes:
      - ./docker/mongodb/configdb:/data/configdb
      - ./docker/mongodb/db:/data/db
    networks:
      - common-link
  mongo-express:
    image: mongo-express
    container_name: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
      ME_CONFIG_MONGODB_URL: mongodb://root:example@mongodb:27017/
    depends_on:
      - mongodb
    networks:
      - common-link
networks:
  common-link:
    driver: bridge

今回はすべてのサービスをbridgeネットワークで構成しています。

必要に合わせて、変更してください。

docker compose の起動

docker-compose.ymlが配置された階層で、以下のコマンドを実行すると、MongoDB と Mongo Express が起動します。

docker compose up -d

起動状況の確認を以下で行います。

docker ps -a

# 出力
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS                      NAMES
fe176c480beb   mongo-express   "tini -- /docker-ent…"   10 seconds ago   Up 2 seconds    0.0.0.0:8081->8081/tcp     mongo-express
f6b94f65e9bb   mongo           "docker-entrypoint.s…"   10 seconds ago   Up 10 seconds   0.0.0.0:27017->27017/tcp   mongodb

docker compose の停止

docker-compose.ymlが配置された階層で、以下のコマンドを実行すると、MongoDB と Mongo Express が停止します。

docker compose down

起動状況の確認を以下で行います。

docker ps -a

# 出力
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS                      NAMES

Mongo Express へのアクセス

Web ブラウザから localhost:8081にアクセスすると Mongo Exporess が表示されます。

Mongo Express を使ってデータベースの管理を置こうことができます。

ただし、Web には認証がありませんので、本番環境で利用する際はご注意ください。

感想

今回、Mongo DB を Docker 環境で行いました。

次は アプリケーションから Mongo DB を利用してみようと思います。

ではでは、また次回。

Python Poetry pyinstallerのインストールエラー

どうも、nippa です。

poetry で pyinstaller をインストールしようとした際にエラーが出ました。

他のパッケージでも起こりうることなので、その解決方法をまとめておきます。

環境

  • macOS 11.6
  • poetry 1.1.14
  • pyinstaller 5.3

インストールのエラー内容

まずpoetry initで poetry の環境を生成しました。

poetry の初期設定後、poetry add pyinstallerを実行してインストールしようとした際に、以下のようなエラーが発生しました。

Using version ^5.3 for pyinstaller

Updating dependencies
Resolving dependencies... (0.0s)

  SolverProblemError

  The current project's Python requirement (>=3.11,<4.0) is not compatible with some of the required packages Python requirement:
    - pyinstaller requires Python <3.11,>=3.7, so it will not be satisfied for Python >=3.11,<4.0

  Because no versions of pyinstaller match >5.3,<6.0
   and pyinstaller (5.3) requires Python <3.11,>=3.7, pyinstaller is forbidden.
  So, because blog-pyinstaller depends on pyinstaller (^5.3), version solving failed.

  at ~/.poetry/lib/poetry/puzzle/solver.py:241 in _solve
      237│             packages = result.packages
      238│         except OverrideNeeded as e:
      239│             return self.solve_in_compatibility_mode(e.overrides, use_latest=use_latest)
      240│         except SolveFailure as e:
    → 241│             raise SolverProblemError(e)
      242│
      243│         results = dict(
      244│             depth_first_search(
      245│                 PackageNode(self._package, packages), aggregate_package_nodes

  • Check your dependencies Python requirement: The Python requirement can be specified via the `python` or `markers` properties

    For pyinstaller, a possible solution would be to set the `python` property to "<empty>"

    https://python-poetry.org/docs/dependency-specification/#python-restricted-dependencies,
    https://python-poetry.org/docs/dependency-specification/#using-environment-markers

原因は、pyinstaller が要求する python のバージョン <3.11,>=3.7poetry initで設定した python のバージョンが合わないことです。

pyinsaller の配布ページにもありますが、対応している python のバージョンが、python 3.10 までであるので、3.11 が対応していないです。

解決方法

pyproject.toml の python のバージョン指定を適切に修正することで解決可能です。

# 修正前
[tool.poetry.dependencies]
python = "^3.9"

# 修正後
[tool.poetry.dependencies]
python = "^3.9,<3.11"

python 3.11 には対応していないという意味の<3.11を追加して上げると、インストール可能になります。

poetry のバージョンの書き方

poetry でのバージョン指定方法は、以下のような形でかけます。

python 3.7 から 3.10 までの場合、以下のようになります。

python = ">=3.7,<3.11"

python 3.9 だけの場合、以下の通りです。

python = "^3.9"

感想

今回 pyinstaller のインストール時にエラーが出ましたが、他のパッケージ、ライブラリでも起こりうるものなので、内容を調べてまとめました。

エラーに困っている人の役にたてればと思います。

ではでは、また次回。

Docker Swarmモードのネットワーク設定

どうも、nippa です。

今回は Docker の Swarm モードでコンテナ同士の通信設定をまとめたいと思います。

コンテナ同士の通信ができると、サービスごとに設定もできるため広がりが出てきます。

環境

Virtual Box 上に Linux サーバを 2 台構築

  • ubuntu 20.04
  • メモリ:2GB
  • ストレージ: 10GB

サーバは

  • Manager サーバ(manager node + work node)
  • Worker サーバ(work node)

と定義します。()の中は swarm モードでの node 構成を示しています。

設定の詳細はこちらの記事に記載してあります。

timesaving.hatenablog.com

ネットワークドライバの種類

Docker 公式ページで記載されているネットワークについてまとめると以下の表のようになります。

ドライバ名 用途
bridge デフォルトのネットワーク。アプリケーションからスタンドアロンにアクセス可能で、外部から直接コンテナにアクセスする場合はこの設定になります。
host スタンドアロンコンテナとホスト間で直接通信する場合の設定で、外部からのアクセスは出来ません。
overlay 複数の Docker デーモン間で相互通信可能な設定になります。Swarm モードで利サービス同士の通信を刷る場合はこの設定になります。
ipvlan IPv4IPv6 を直接コンテナに割り振り、制御する設定になります。
macvlan コンテナに物理的な Mac アドレスをを仮想的に割り振る設定になります。
none ネットワーク機能をすべて無効な設定です。

この他に、サードパーティプラグインをインストールすれば利用可能になります。

Docker のネットワークの生成

コンテナ間の相互通信を行うためには、overlayドライバを利用します。

docker のネットワークの生成は下記のコマンドで行います。

docker network create -d [ドライバ名] [ネットワーク名]

Swarm モードのサービス間での相互通信

まず、overlayドライバでのネットワークを生成します。

Swarm モードのサービス間の通信の場合は、以下のオプションで作成します。

docker network create -d overlay [ネットワーク名]

スタンドアロンコンテナをネットワークに接続する場合には--attachableオプションをつけて、ネットワークを生成します。

docker network create -d overlay --attachable [ネットワーク名]

今回は IP アドレスの範囲指定や、サブネット、ゲートウェイについては指定しません。

必要な場合はdocker network create --helpでオプションを確認できますので、用途に合わせて設定してください。

オーバーレイネットワーク上のトラフィックの暗号化

トラフィックの暗号化が必要な場合は、--opt encryptedオプションを利用することで暗号化可能です。

12 時間ごとに鍵が変更される仕様になっています。

ただし、Windows 上ではサポートされていない機能ですので、ご注意ください。

docker network create -d overlay --opt encrypted --attachable [ネットワーク名]

Swarm モードのサービスごとの設定

Swarm モードのサービスごとに公開ポートの設定が必要になります。

公開ポートが 8080 で、内部のサービスポートが 80 で、通信方式が TCP の場合、次のコマンドでポートの設定が可能です。

# サービスの生成
docker service create -p 8080:80/tcp [サービス名]

# サービスの更新
docker service update -p 8080:80/tcp [サービス名]

この書き方は複数ありますので、Docker 公式でご確認ください。

感想

今回ネットワークの設定方法をまとめましたので、実際に設定してコンテナ間の通信をしてみたいと思います。

ではでは、また次回。

Docker Swarmモードでのnode管理

どうも、nippa です。

Docker Swarm モードを利用していますが、ノードの管理方法を記事にまとめておこうと思います。

環境

Virtual Box 上に Linux サーバを 2 台構築

  • ubuntu 20.04
  • メモリ:2GB
  • ストレージ: 10GB

サーバは

  • Manager サーバ(manager node + work node)
  • Worker サーバ(work node)

と定義します。()の中は swarm モードでの node 構成を示しています。

設定の詳細はこちらの記事に記載してあります。

timesaving.hatenablog.com

node 一覧表示

以下のコマンドで、ノード一覧を表示します。

docker node ls

node の詳細確認

以下のコマンドで、アクセス中 manager node の swarm モードの詳細を確認することができます。

docker node inspect self --pretty

他のノードの詳細を確認する場合は、

docker node ls

で表示されるIDまたはHostnameを指定すると詳細を確認することができます。

docker node inspect [ID or Hostname] --pretty

manager node の Drain

manager node を Swarm モードから Drain する場合、

docker node update --availability drain [ID or Hostname]

IDまたはHostnameを指定することで Drain にすることができます。

manager node の active

manager node を Swarm モードから Drain する場合、

docker node update --availability active [ID or Hostname]

IDまたはHostnameを指定することで Active にすることができます。

manager node への昇格

以下のコマンドで、指定した node を manager node へ昇格することができます。

docker node promote [ID or Hostname]

manager node からの降格

以下のコマンドで、指定した node を manager node へ降格することができます。

docker node demote [ID or Hostname]

node のメタ情報の追加

--label-add [key]で、指定したノードにラベル() を追加することができます。

docker node update --label-add database [ID or Hostname]

ノードのラベルの確認には、docker node inspect [ID or Hostname] --pretty

複数指定することも可能です。また、<key>=<value>という形でラベルを指定することもできます。

node のメタ情報の削除

以下のコマンドでラベルを上書きして削除します。

docker node update [ID or Hostname]

Swarm からノードの除外

以下のコマンドを各ノードで実行することで swarm モードから除外されます。

docker swarm leave

manager node から除外を実行する場合は、以下のコマンドで行います。

docker node rm [ID or Hostname]

感想

今回、ノード管理についてまとまめました。

ラベルをつけることで、ラベルのついた node へのコンテナをデプロイすることができるようになります。

ではでは、また次回。