見出し画像

【検証】AIを使って有名女優に似てるセクシー女優を探してみた!

はじめに


初めまして。Akiyama Yutaです。

今日は以下の「【検証】AIを使って有名女優に似てるセクシー女優を探してみた!」の動画で使用したコードの解説を行ってきます。



学べる内容

  • 実務的なAWSのクラウドサービスの使い方

  • 外部APIを連携してのデータ収集

  • PythonでのWebスクレピング

  • AIを使った問題解決力が身につきます。

前提

  • Pythonの基本的な文法が理解できる方

  • HTML, CSSのことが理解できている方

  • macOSを使用して進めていきますが、Windowsでも同様に進めることができます。

実装するのに使用する技術

  • Python(versionは3.9を使用)

  • Googleサービスの設定
    ・Custom Search Api
    ・Programmable Search Engine
    ※ 通常であれば、使用するのに10ドル(画像検索を2000件するため)かかりますが、最初の方は300 ドルの無料トライアルの範囲内で実装可能です。

  • AWSサービス
    ・AWS Lambda
    ・Amazon DynamoDB
    ・Amazon S3
    ・Amazon Rekognition
    ※ AWS関連のサービスも費用は発生しますが、対象者は無料利用枠で実装可能です。使いすぎは注意してください。

処理の全体像

以下の処理をPythonを使って実装していきます。

  1. 日本で活躍してるAV女優の名前のリストを作成する

  2. その次に、AV女優につき5枚くらいの写真を集める

  3. 集めたデータをAIに学習させて、似ている候補を予測させる

似ている候補を推測させる流れとしては、以下になります。

1. AV女優の名前と画像をスクレピング

まず、AV女優の名前と画像をスクレイピングします。PythonのライブラリであるSeleniumを使用します。SeleniumはWebブラウザの自動操作を可能にするツールです。今回は、Jav.Guruというサイトから該当する要素をを取得して行きたいと思います。

最初にこちらが今回使用したスクレイピングのコードになります。

# get_actress_info.py

import csv
import time

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

# Selenium WebDriverの設定(ChromeDriverを使用する例)
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager(driver_version="114.0.5735.90").install()))

"""
https://jav.guru/jav-actress-listから女優名と画像のみを抜き取る。
"""
# 名前と画像URLを格納するリスト
actress_list = []
# 読み取るページの最大ページ
max_page_number = 80
for page_number in range(max_page_number):
    # 1秒間の待機処理を入れる
    time.sleep(1)
    url = f"https://jav.guru/jav-actress-list/page/{page_number + 1}/"
    # ブラウザでページを開く
    driver.get(url)

    # 名前が含まれる要素を取得
    actress_infos = driver.find_elements(By.CLASS_NAME, "actress-info")

    # 各要素から漢字の名前を抽出してリストに追加
    for actress_info in actress_infos:
        img_url = actress_info.find_element(By.TAG_NAME, "img").get_attribute("src")
        span_elements = actress_info.find_elements("css selector", "span")
        # テキストから漢字の名前と写真URLだけを抽出
        if len(span_elements) == 4:
            actress_name = span_elements[2].text
            print(f"{actress_name}を発見!")
            actress_list.append([actress_name, img_url])
    break
# WebDriverを終了
driver.quit()

# CSVファイルを開く
output_file_path = "OUTPUT/sexy_actress_name.csv"
with open(output_file_path, "w", encoding="utf-8-sig", newline="") as file:
    writer = csv.writer(file)
    writer.writerow(["actress_name", "img_url"])
    # リストの各要素を書き込む
    for row in actress_list:
        writer.writerow(row)

一番最初の行で必要なモジュールをインポートしています。

import csv
import time

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

以下のコードで、seleniumとwebdriver_managerをインストールします。

pip install selenium==4.10.0 webdriver-manager==4.0.0

各ページの画像の赤枠の要素を取得します。

ブラウザーの開発者ツールを開いて、該当するHTMLの要素を確認する。


actress_listという空のリストを作成します。このリストは、後の処理で得られる女優の名前と画像URLを格納するためのものです。

  1. max_page_numberとして80を設定しています。これは、スクリプトが読み取るウェブページの最大数を示しています。

  2. 0から最大ページ数(この場合は80)までの範囲でループを開始します。各ループでは以下の処理が行われます:

    • まず、1秒間スクリプトの実行を待機します。これは、連続的なリクエストによりウェブサイトのサーバーに負荷をかけすぎないようにするための配慮です。

    • 次に、特定のウェブページのURLを作成します。このURLは、ページ番号を含んでおり、ループの各ステップで異なるページにアクセスします。

    • WebDriverを使って、作成したURLのウェブページを開きます。

    • ページから女優の情報が含まれる要素を取得します。これは、HTMLのクラス名を使って行います。

    • 取得した各要素から、女優の名前と画像URLを抽出します。これらの情報はactress_listに追加されます。

  3. 最後に、WebDriverを終了して、ブラウザのセッションを閉じます。

# 名前と画像URLを格納するリスト
actress_list = []
# 読み取るページの最大ページ
max_page_number = 80
for page_number in range(max_page_number):
    # 1秒間の待機処理を入れる
    time.sleep(1)
    url = f"https://jav.guru/jav-actress-list/page/{page_number + 1}/"
    # ブラウザでページを開く
    driver.get(url)

    # 名前が含まれる要素を取得
    actress_infos = driver.find_elements(By.CLASS_NAME, "actress-info")

    # 各要素から漢字の名前を抽出してリストに追加
    for actress_info in actress_infos:
        img_url = actress_info.find_element(By.TAG_NAME, "img").get_attribute("src")
        span_elements = actress_info.find_elements("css selector", "span")
        # テキストから漢字の名前と写真URLだけを抽出
        if len(span_elements) == 4:
            actress_name = span_elements[2].text
            print(f"{actress_name}を発見!")
            actress_list.append([actress_name, img_url])
    break
# WebDriverを終了
driver.quit()

次の処理では、女優の名前と画像URLを含むリスト(actress_list)をCSVファイルに書き出します。開いたCSVファイルに対して、まずヘッダーとして"actress_name""img_url"を書き込み、その後でリストの各要素(名前とURLのペア)を新たな行として書き込みます。

# CSVファイルを開く
output_file_path = "OUTPUT/sexy_actress_name.csv"
with open(output_file_path, "w", encoding="utf-8-sig", newline="") as file:
    writer = csv.writer(file)
    writer.writerow(["actress_name", "img_url"])
    # リストの各要素を書き込む
    for row in actress_list:
        writer.writerow(row)

2. AWSの初期設定

まず最初に、コマンドからAWSのサービスを操作できるように必要な設定をしていきましょう。

  • ライブラリをインストール

ここから先は

15,554字

¥ 2,980

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?