見出し画像

星占いのテキストからお題を出力して絵を描く

絵を描くことが好きである。しかし描きたいものが、わからない。「とにかく手を動かして、毎日続けることは大切!」ということはわかる。しかし、何を描けばいいのかわからないから、手は動かない。
この解決策として「お題を生成する」ということを考えてみた。

きっかけ

お題があると「何を描くか」が解決する。それに加えて、自分なりにどうアプローチしていくかということに頭をひねる作業が発生し、なかなか面白い。

2020年4月、Processing Community Japanの企画で「Daily Coding Challenge」という、「毎日50音順のお題に沿ってみんなでコーディングする」企画があった。『張本人』『二年前』など、ビジュアルがすぐには思い浮かばないものも多く、またTwitterに投稿された他の皆さんの作品とお題への解釈を見ることはエキサイティングだった。

dailyなので、ある程度の区切りをつけて続けていける。区切りは大切である。今日は思ったようにできなくても、明日また頑張れば良い。全ては練習であって、本番ではない。だから気負わずに続けられる。

お題を決めてもらえばいいんだ!

お題とは、自分で決めるのではなく、第三者から出題されるものである。できれば予想外のお題が良い。
占いの結果一覧を眺めていると、「何これ?」と思ってしまうものまたくさんある。YAHOO!JAPAN占いではラッキースポットに「跨線橋」(読み:コセンキョウ)がでてくることがある。跨線橋とは、鉄道の線路を越えるためにある、立体交差の橋で、発着する電車を上から見渡せるスポットである。ラッキースポットのセレクトとして、なかなか渋い。
そもそも占いには、自分では決められないことを委ねる面もある。

お題の出力ルール

どの項目にするか

ラッキースポットやラッキーアイテムだと具体的なビジュアルやイメージが先にあり、スケッチ的なものになってしまいがちになる。せっかくなら、もう少し広い解釈でできるといい。

そこで着目したのはdocomo占いの「ラッキーアクション」である。モノではなくコトなので、描く絵に幅が出る。内容も「折り紙を折ってみよう」や「靴ひもを結び直してみよう」など思いもよらないものがある。
2022年4月の1ヶ月分を見てみたところ、12星座で約350パターンあった。パターン数が豊富であるほど、お題が重複してしまう可能性も低い。

また、ページは同じURLの毎日更新で、過去分や未来分が見れない。そのため、1日で区切りをつけることができる。
翌日のお題が見れてしまうと、それを考え始めてしまうかもしれない。夜はちゃんと寝るために、翌日分を先取りできない方が良い。

どの星座にするか

「ラッキーアクション」は毎日12星座分が更新される。1日位に12枚の描くのはハードすぎる。どの星座のラッキーアクションをお題として出力するかを考えなければならない。
そこで、「月が位置している星座」に着目することにした。(参考:MOON CALENDAR)2〜3日周期で変わり、docomo占いの結果も月の運行には紐づいていないであろうことを2022年4月分の結果一覧から推測してた。

なに色を使うか

せっかくなので、使用する色も「ラッキーカラー」から出力してみようと思った。
サイトによって提示されるラッキーカラーは全く異なる。(過去記事参照
そのため、複数のサイトからラッキーカラーを出力すれば、自分では思いつかないような色の組み合わせが発生するだろう。

どのようにスクレイピングするか

お題の出力は、PythonのWebスクレイピングによっておこなう。

月の位置している星座(Moon Sign)の情報を取得する

まずは、今日は月がどの星座に位置しているのかを取得する必要がある。
先ほどのMOON CALENDARでは、「今日」を自動で指定することが難しく、voidタイム(月が次の星座に移動する時間)が含まれる日は、
データ取得後に整理が必要になりそうだ。

そこで、海外のサイトに着目してみた。
ASTRO SEEKのMoon Phase Calendarだ。

このサイトだと、その日に月が位置している星座(Moon Sign)がdum-znameni astro_znというclassのtdタグから取得できる。

ラッキーカラー取得元の選定

上記に該当する星座のラッキーカラーを取得する。
ラッキーカラーがMoon Signに紐づく出し方をしている星占いサイトにしてしまうと、結果にバリエーションが出なくなってしまう。
そのためMoon Signには関係ないと推測され、ある程度のパターンがあるサイトとして占い@niftyWoman.excite星占いからラッキーカラーを出力することとする。(詳細については拙文の過去記事参照

対応表の作成

それぞれ、各星座の記事のURLを星座名などで分けているのだが、この表記ルールは統一されていない。
例えば、「牡羊座」は『ASTRO SEEK』では「Aries」だが、占い@niftyでは「ohitsuji」、Woman.excite星占いでは「ar」、docomo占いでは「01」である。そのため、対応表をcsvで作成し、スクレイピングコードを実行した際にそこを参照するようにした。

作成した対応表。pythonファイルと同じ場所に保存しておく。


pythonコード

そして作成したコードが以下となる。

import requests
from bs4 import BeautifulSoup
import pandas as pd
import datetime
df=pd.read_csv("zodiURL_list.csv")
load_URL="https://mooncalendar.astro-seek.com/?narozeni_city=Tokyo%2C+Japan&narozeni_input_hidden=Japan%2C+USA%2C+Missouri&narozeni_hidden_local_tz=1&narozeni_stat_hidden=JP&narozeni_podstat_hidden=Tokyo&narozeni_podstat_kratky_hidden=&narozeni_podstat2_kratky_hidden=&narozeni_podstat3_kratky_hidden=&narozeni_mesto_hidden=Tokyo&narozeni_den=30&narozeni_mesic=04&narozeni_rok=2022&tolerance=1&narozeni_sirka_stupne=35&narozeni_sirka_minuty=41&narozeni_sirka_smer=0&narozeni_delka_stupne=139&narozeni_delka_minuty=42&narozeni_delka_smer=0#select_local_tz_anchor"
#タイムゾーンをTokyoにしないと、時差の都合で朝はまだ昨日の結果がでてしまう
html=requests.get(load_URL)
soup=BeautifulSoup(html.content,"html.parser")
element=soup.find(class_="dum-znameni astro_zn")
filename="202205_theme.csv"
with open(filename,"a")as f: #★ファイルを初めて作成する時は"w"、追記は"a"
#いつのデータかを記録するために日付記載しよう

today = datetime.datetime.now()
day=today.date()
print(day)
f.write(str(day)+"\n")

day=element.find_all("td")[4]#class_="dum-znameni astro_zn"の中の4番目のtdタグを取得する
print(day.text)

moonsign=element.find("img").get("alt")
print(moonsign)#月がどの星座にあるか
#結果をcsv書き込み
f.write(moonsign)
f.write("\n")

moonloc=moonsign

if moonloc == "Aries":
    column=0
elif moonloc == "Taurus":
    column=1
elif moonloc == "Gemini":
    column=2
elif moonloc == "Cancer":
    column=3
elif moonloc == "Leo":
    column=4
elif moonloc == "Virgo":
    column=5
elif moonloc == "Libra":
    column=6
elif moonloc == "Scorpio":
    column=7
elif moonloc == "Sagittarius":
    column=8
elif moonloc == "Capricorn":
    column=9
elif moonloc == "Aquarius":
    column=10
elif moonloc == "Pisces":
    column=11

#niftyのラッキーカラー・スクレイピングする。    
nifZodi=df.loc[column]["nifty"]
#print(nifZodi)
baseURL="https://uranai.nifty.com/f12seiza/"
zodiURL=nifZodi

url=baseURL+zodiURL
html=requests.get(url)
soup=BeautifulSoup(html.content, "html.parser")
element=soup.find(class_="hako2")
print(element.find("p").text)
#結果をcsv書き込み
f.write(element.find("p").text)
f.write("\n")


#woman.exciteのラッキーカラー・スクレイピングする。
womZodi=df.loc[column]["woman"]
#print(womZodi)
baseURL="https://fortune.woman.excite.co.jp/free/horoscopes/sign_"
zodiURL=womZodi

url=baseURL+zodiURL
html=requests.get(url)
soup=BeautifulSoup(html.content, "html.parser")
lucky=soup.find(class_="item")
for color in lucky.find_all("span")[0]:
    print(color)
    #結果をcsv書き込み
    f.write(color)
    f.write("\n")


#docomoのラッキーアクションをスクレイピングする
docZodi=df.loc[column]["docomo"]
baseURL="https://service.smt.docomo.ne.jp/portal/fortune/src/fortune_"
tailURL=".html"
zodiURL=(str(docZodi).zfill(2))
#urlは「01」と表示されるがcsvは「1」で入ってしまっているため、str型にしてゼロ埋めする必要がある

URL=baseURL+zodiURL+tailURL
html=requests.get(URL)
soup=BeautifulSoup(html.content,"html.parser")
#print(soup.find("h3").text) #星座名を取得する
for element in soup.find_all("dd")[2]:#ddタグで2番目の「ラッキーアクション」だけ取得する
    print(element)
    #結果をcsv書き込み
    f.write(element)
    f.write("\n")


    #ddダグ→0:カラー、1:アイテム、2:アクション

出力結果はこうなる

2022-05-15
May 15, 2022
Scorpio
グラスグリーン
エメラルドグリーン
天丼を食べてみよう。

こうしてお題を元に絵を描いていく

自分のルールとして「所詮は遊びなので、がんばりすぎない」と決めて2022年5月1日からゆるゆると始めてみた。Daily Drawing Challengeである。
ひとまず2週間は続けることができた。
これについては、次の記事でまとめる。


もっと効率の良いコーディングがありましたら、ご教示いただけますと幸いです。

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