はじめに
初めまして。三日目担当の太田です。
Qiita初投稿なので稚拙な文章となっておりますがご了承を。。。
今回の記事は私が超超超簡単なスクレイピングをしたという話です。
何したの?
いつぞやのwatnowハッカソン終わって以来、毎週定期的に学校の図書館予約するようになった私。
でも
毎回図書館にアクセスして、
日にちを指定して、
教室を予約して、
予約できたらグループに報告。
この一連の流れを全部自動化できたらなあ!
っというのが今回の動機でした。目標でもありました。
しかしながら結果から言うと全部は無理でした。
今回は自分ができた『グループに報告』部分だけ紹介できたらなと思います。
作り方
自分が触ったことのある言語でスクレイピングしやすいのは無難にPythonかなという安直な考えで言語決定。
Chromeを起動
Chromeはこれだけで開きます。
from selenium import webdriver
driver = webdriver.Chrome()
簡単な人間なのでこれだけで感動しました。
実行してみたページがこちら。
あとはこれにURLを開くように指示したりどこのボタンを押させるように指示するだけ!
今回の手順としては
手順1: manabaログイン画面起動
手順2:ログイン情報を入力
手順3:利用予約教室野情報を取得
となっています。
htmlの指定
ところでボタンやinputタグのしてはどうやるの?と思う方もいると思います!
では、webの検証ツールを使ってみましょう。webサイトを開いてF12
を押してみると出てくると思います。
出てこない方はMacOSならCommand+Shift+C
WindowsならControl+Shift+C
で表示されると思います。
今回はこのUserIDとPasswordを自動で入力し、Sign Onボタンを押させたいですね。
ではUserIDとPasswordがどのタグなのかみてみましょう。
このような感じでカーソルを合わせるとタグやら属性がどこに記述されているかがわかると思います。
例として今回のUserIDは
<input type="text" name="USER" id="User_ID" class="input">
と言うタグであることがわかると思います。
このタグはname属性がUSER
となっているのでfind_element
関数でname
を指定しあげます。
driver.find_element_by_name("USER")
Seleniumの構文に関してはこちらを参照ください。
これらのコードを繋ぎ合わせると
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import requests
from bs4 import BeautifulSoup
options = Options()
options.headless = True # ヘッドレスモード True=非表示, False=表示
driver = webdriver.Chrome(options=options)
# メールアドレスとパスワードの指定
USERNAME = "あなたのユーザーネーム"
PASS = "あなたのパスワード"
# ブラウザを起動
driver.get(
"ここにURL"
)
time.sleep(2) # 2秒待機
# ログイン情報を入力する
search_name = driver.find_element_by_name("USER")
search_pass = driver.find_element_by_name("PASSWORD")
search_btn = driver.find_element_by_id("Submit")
search_name.send_keys(USERNAME)
search_pass.send_keys(PASS)
search_btn.click()
time.sleep(2) # 2秒待機
これでログインできるようになりました!
あとは自分の予約した情報を取得して文章を整理して完成!
出来上がったものがこちら笑
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import re
from linetest import send_line_notify
from bs4 import BeautifulSoup
def run():
options = Options()
options.headless = True # ヘッドレスモード True=非表示, False=表示
driver = webdriver.Chrome(options=options)
# メールアドレスとパスワードの指定
USERNAME = "あなたのユーザーネーム"
PASS = "あなたのパスワード"
# ブラウザを起動
driver.get(
"ここにURL"
)
time.sleep(2) # 2秒待機
# ログイン情報を入力する
search_name = driver.find_element_by_name("USER")
search_pass = driver.find_element_by_name("PASSWORD")
search_btn = driver.find_element_by_id("Submit")
search_name.send_keys(USERNAME)
search_pass.send_keys(PASS)
search_btn.click()
time.sleep(2) # 2秒待機
# 利用予定教室の情報を取得
soup = BeautifulSoup(driver.page_source, "html.parser")
user_rsv_ul = soup.find('ul',class_="user_rsv")
#もし教室が取れていたら
if user_rsv_ul:
tag = soup.find(href=re.compile("void"))
tag_text = tag.text.strip()
cleaned_text = ' '.join(tag_text.split())
date_text = cleaned_text.replace(' ( ', ' ').replace(' )', '').replace('~', '~')
date_text = f"日時:{date_text}"
text_after_a = tag.next_sibling.strip()
lines = [line.strip() for line in text_after_a.split('\n') if line.strip()]
formatted_text = '教室が取れました。\n' + '\n'.join(lines)+ '\n' + date_text
print(formatted_text)
else:
print("教室はまだ取れていません。")
if __name__ == "__main__":
run()
実行結果
これで完成となります!実際はこれをLineNotifyにのせて実行しているのですがそれは割愛します。
最後に
スクレイピングは過去にアクセス障害につながり逮捕に至った例があると聞きますね。
今回のスクレイピングは週一で手動実行でデプロイすらしていないので大丈夫だと信じつつ、違法の線引きをちゃんと確認しながら勉強している途中です。
稚拙な文章とぐちゃぐちゃなコードでしたが、最後まで見ていただきありがとうございました。
今も勉強中ですので、この分野の先輩方からたくさん指摘をもらえるとありがたいです。