はじめに
ハッピーメリークリスマスイブイブ!
こんにちは。harryです。
いよいよ明日はクリスマスイブ、明後日はクリスマスです!
ということで、今回は去年作成したWebスクレイピングを使って月の画像を取得し、壁紙にするという作成物に少しコードを追加し、クリスマスになると壁紙が月ではなくクリスマスの画像に変更されるようにしてみました。
また、タスクスケジューラを使ってわざわざ自分で実行しなくても自動的にプログラムが実行されて壁紙が変更されるようにもしてみました。
去年の作成物
今回は先ほども説明した通り、去年の作成物にコードを追加した形となっているため、まずは去年の作成物の紹介をさらっとしようと思います。
import ctypes
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
from PIL import Image
url = "https://eto-calendar.com/astronomy/moon/?date=today"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
data = []
for img in soup.select('.moonimage img'):
data.append(dict(src=img['src']))
print(data)
#いらない部分を消す
data_ = str(data)
data_ = data_.replace("""[{'src': '""", '')
data_ = data_.replace("""'}]""", '')
print(data_)
#取得したsrcを絶対URLにする
absolute_url = urljoin('https://eto-calendar.com/astronomy/moon/', data_)
print(absolute_url)
#URLを指定して画像をダウンロードする https://qiita.com/ozaki_physics/items/c17ca626b480d352e90f
file_name = "今日の月.jpg"
response = requests.get(absolute_url)
image1 = response.content
with open(file_name, "wb") as aaa:
aaa.write(image1)
#画像をトリミングする https://note.nkmk.me/python-pillow-image-crop-trimming/
im = Image.open(r"C:\Users\s23t330\Desktop\python\今日の月.jpg")
im_crop = im.crop((0, 0, 1000, 800))
im_crop.save(r"C:\Users\s23t330\Desktop\python\今日の月.jpg", quality=95)
#画像に余白を追加する https://note.nkmk.me/python-pillow-add-margin-expand-canvas/
im = Image.open(r"C:\Users\s23t330\Desktop\python\今日の月.jpg")
def add_margin(pil_img, top, right, bottom, left, color):
width, height = pil_img.size
new_width = width + right + left
new_height = height + top + bottom
result = Image.new(pil_img.mode, (new_width, new_height), color)
result.paste(pil_img, (left, top))
return result
im_new = add_margin(im, 300, 4000, 2500, 7500, (0, 0, 0))
im_new.save(r"C:\Users\s23t330\Desktop\python\今日の月.jpg", quality=95)
#壁紙にする https://qiita.com/lobmto/items/6d3649e6c00b98553ca2
ctypes.windll.user32.SystemParametersInfoW(20, 0, r"C:\Users\s23t330\Desktop\python\今日の月.jpg", 0)
システムの流れ
- Webスクレイピングで月の画像のsrcを取得
- 取得したsrcのいらない部分を削除し、相対URLから絶対URLにする
- 作成したURLを指定して画像をダウンロード
- ダウンロードした画像をトリミングし、余白を追加
- 壁紙にする
詳しい説明に関してはTechnologics vol.4に載っているため気になる方は見てみてください。
日付の取得
Pythonで日付を取得するには標準ライブラリのdatetimeモジュールを使います。
import ctypes
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
from PIL import Image
import datetime
#今日の日付を取得
dt_now = datetime.datetime.now()
print(dt_now.strftime('%Y/%m/%d'))
これを実行すると以下のように今日の日付を出力することができます。
クリスマスにはクリスマスの壁紙に!
先ほど取得した日付を使ってもし12/25だったら壁紙を月ではなくクリスマス用の画像に変更するようにします。
if dt_now.strftime('%m%d') == "1225":
file_name = r"C:\Users\s23t330\Desktop\python\Christmas.png"
else:
url = "https://eto-calendar.com/astronomy/moon/?date=today"
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
data = []
for img in soup.select('.moonimage img'):
data.append(dict(src=img['src']))
print(data)
#いらない部分を消す
data_ = str(data)
data_ = data_.replace("""[{'src': '""", '')
data_ = data_.replace("""'}]""", '')
print(data_)
#取得したsrcを絶対URLにする
absolute_url = urljoin('https://eto-calendar.com/astronomy/moon/', data_)
print(absolute_url)
#URLを指定して画像をダウンロードする https://qiita.com/ozaki_physics/items/c17ca626b480d352e90f
file_name = r"C:\Users\s23t330\Desktop\python\今日の月.jpg"
#以下略
ここに色々な行事の日付と画像を追加してみるデスクトップをカレンダー代わりにできるかもしれませんね!
タスクスケジューラについて
タスクスケジューラの使い方に関しては、以下のURLを参考にしました。使ってみたいという方がいたら、ぜひ見てみてください。
注意点
タスクスケジューラでプログラムを実行する場合に、ソースコードに相対パスがあるとちゃんと実行することができませんでした。タスクスケジューラを使ってプログラムを実行した時に画像が読み込まれない場合は、ソースコードに相対パスが含まれていないかを確認し、絶対パスに変えてみてください。
さいごに
今回は、日付の取得をしてクリスマスにデスクトップの壁紙がクリスマスの画像になるようにしてみました。他の行事を追加したり、季節ごとに壁紙が変更されるようにしたりするのも、季節を感じることができて良いかもしれませんね。
参考文献