![見出し画像](https://assets.st-note.com/production/uploads/images/113333883/rectangle_large_type_2_559ec3a763e870538655b02b306bb6c2.png?width=800)
【検証】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を使って実装していきます。
日本で活躍してるAV女優の名前のリストを作成する
その次に、AV女優につき5枚くらいの写真を集める
集めたデータを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を格納するためのものです。
max_page_numberとして80を設定しています。これは、スクリプトが読み取るウェブページの最大数を示しています。
0から最大ページ数(この場合は80)までの範囲でループを開始します。各ループでは以下の処理が行われます:
まず、1秒間スクリプトの実行を待機します。これは、連続的なリクエストによりウェブサイトのサーバーに負荷をかけすぎないようにするための配慮です。
次に、特定のウェブページのURLを作成します。このURLは、ページ番号を含んでおり、ループの各ステップで異なるページにアクセスします。
WebDriverを使って、作成したURLのウェブページを開きます。
ページから女優の情報が含まれる要素を取得します。これは、HTMLのクラス名を使って行います。
取得した各要素から、女優の名前と画像URLを抽出します。これらの情報はactress_listに追加されます。
最後に、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のサービスを操作できるように必要な設定をしていきましょう。
ライブラリをインストール
ここから先は
¥ 2,980
この記事が気に入ったらサポートをしてみませんか?