趣旨:
実装手順:
ネットから映画情報(映画名)をスクレイピングで取得
↓
取得したデータを格納する(リストorDataFrame)
↓
映画データの好き嫌い判定
↓
好き→好きリスト
嫌い→嫌いリストに格納
↓
好きリストからランダムに1つおすすめ
↓
おすすめ映画を見たいか見たくないかを判定
↓
いま見たい映画を決定
●ネットから映画情報(映画名)をスクレイピングで取得~
取得したデータを格納する(リストorDataFrame)
内容:
スクレイピングで映画名を取得
↓
映画名をリストに格納
↓
映画名をCSVファイルに格納
実装したコード:
import requests
from bs4 import BeautifulSoup
# Webページを取得して解析する
load_url = "https://pixiin.com/vod-amazon-prime-video/"
html = requests.get(load_url)
soup = BeautifulSoup(html.content, "html.parser")
# すべてのliタグを検索して、その文字列を表示する
film_list = []
for element in soup.find_all("td",{'class':'nm'}): # すべてのliタグを検索して表示
film_list.append(element.text)
# 映画名をCSVファイルに格納する
import csv
with open('movie_title.csv', 'w', encoding= 'UTF-8', newline='') as movie_title:
writer = csv.writer(movie_title)
writer.writerow(["RollNo", "Name", "Subject"])
for i, title in enumerate(film_list):
writer.writerow([i, title])
映画データの好き嫌い判定
内容:
映画名が格納されているCSVファイルから,映画名を1つランダムに取り出す
↓
好きであれば,好きな映画CSVファイルに書き込み
嫌いであれば,嫌いな映画CSVファイルに書き込み
わからなければ,知らない映画CSVファイルに書き込み
実装したコード:
import csv
import random
# movie_titleからランダムに1つ映画名を取り出す
#csvファイルを指定
MyPath = 'movie_title.csv'
#csvファイルを読み込み
lines = []
already_film = []
like_film = []
dislike_film = []
with open(MyPath, 'r', encoding='UTF-8') as f:
file_data = f.readlines()
for line in file_data:
lines.append(line)
num = random.randint(0,len(lines))
film = print(lines[num])
1already_film.append(film)
like_or_dislike = input('1,2,3\n')
if like_or_dislike == '1':
like_film.append(film)
elif like_or_dislike == '2':
dislike_film.append(film)
print(like_film)
print(dislike_film)
改善策:
ランダムで抽出した映画名が保持されず,リストの中身が常にNoneとなってしまう.
改善版:映画データの好き嫌い判定
内容
ランダムに1つ映画をピックアップして,好き嫌いを判定.
好き→好きな映画リストに
嫌い→嫌いな映画リストに
わからない→嫌いな映画リストに
追加をする
これを10回繰り返し,3種類のリストを表示する
実装したコード
import csv
import random
# movie_titleからランダムに1つ映画名を取り出す
#csvファイルを指定
MyPath = 'movie_title.csv'
#csvファイルを読み込み
lines = []
like_film = []
dislike_film = []
for i in range(10):
with open(MyPath, 'r', encoding='UTF-8') as f:
file_data = f.readlines()
for line in file_data:
lines.append(line)
num = random.randint(0,len(lines))
film = lines[num]
print(film)
like_or_dislike = input('1,2,3\n')
if like_or_dislike == '1':
like_film.append(film)
elif like_or_dislike == '2':
dislike_film.append(film)
print(like_film)
print(dislike_film)
好き・嫌い・知らない映画をCSVファイルに保存
内容
好き・嫌い・知らない判定をした映画を,CSVファイルに保存する
実装したコード
import csv
import random
# movie_titleからランダムに1つ映画名を取り出す
#csvファイルを指定
MyPath = 'movie_title.csv'
#csvファイルを読み込み
lines = []
like_film = []
dislike_film = []
unknown_film = []
for i in range(10):
with open(MyPath, 'r', encoding='UTF-8') as f:
file_data = f.readlines()
for line in file_data:
lines.append(line)
num = random.randint(0,len(lines))
film = lines[num]
print(film)
like_or_dislike = input('1,2,3\n')
if like_or_dislike == '1':
like_film.append(film)
elif like_or_dislike == '2':
dislike_film.append(film)
else:
unknown_film.append(film)
print(like_film)
print(dislike_film)
print(unknown_film)
with open('like_movie_title.csv', 'w', encoding= 'UTF-8', newline='') as like_movie_title:
writer = csv.writer(like_movie_title)
writer.writerow(["RollNo", "Name", "Subject"])
for i, title in enumerate(like_film):
writer.writerow([i, title])
with open('dislike_movie_title.csv', 'w', encoding= 'UTF-8', newline='') as dislike_movie_title:
writer = csv.writer(dislike_movie_title)
writer.writerow(["RollNo", "Name", "Subject"])
for i, title in enumerate(dislike_film):
writer.writerow([i, title])
with open('unknown_movie_title.csv', 'w', encoding= 'UTF-8', newline='') as unknown_movie_title:
writer = csv.writer(unknown_movie_title)
writer.writerow(["RollNo", "Name", "Subject"])
for i, title in enumerate(unknown_film):
writer.writerow([i, title])
改善策
・どう見ても,同じ内容のコードを3回繰り返している,def(),クラスを使えばもっとスマートなコードになるだろうが,一応やりたいことは実現できている.
・コードを実行するたびに,CSVファイルが上書きされてしまう.
単に映画を1本おすすめしてくれるコード
import csv
import random
# movie_titleからランダムに1つ映画名を取り出す
#csvファイルを指定
MyPath = 'movie_title.csv'
#csvファイルを読み込み
lines = []
already_film = []
like_film = []
dislike_film = []
with open(MyPath, 'r', encoding='UTF-8') as f:
file_data = f.readlines()
for line in file_data:
lines.append(line)
num = random.randint(0,len(lines))
film = print(lines[num])
like_or_dislike = input('見たいですか?見たくないですか?\n')
while like_or_dislike == 'no':
if like_or_dislike == 'yes':
pass
elif like_or_dislike == 'no':
with open(MyPath, 'r', encoding='UTF-8') as f:
file_data = f.readlines()
for line in file_data:
lines.append(line)
num = random.randint(0, len(lines))
film = print(lines[num])
like_or_dislike = input('見たいですか?見たくないですか?\n')
print('Have a good night!!')
まとめ
一旦,ここで締める.変数の中身が保持されない,CSVファイルが書き込みされない,この2点でかなりの時間を使ってしまった.自力でコーディングするとはこういうことかと痛感しているが,ただ答えをコピペして「やっている感」を味わっていた時よりも充実度と成長しているような気がするので,良しとする.ただ,1つのエラー解消に固執しすぎるのはぜひともやめたいので,どこかで耳にした「15分ルール」を実践するためにエラー解消に取り掛かるタイミングで,Siriを呼び出し15分のアラームをかける習慣をつけようと思う.