LoginSignup
5
1

ちょっとスクレイピング触った話

Last updated at Posted at 2023-12-02

はじめに

初めまして。三日目担当の太田です。
Qiita初投稿なので稚拙な文章となっておりますがご了承を。。。

今回の記事は私が超超超簡単なスクレイピングをしたという話です。

何したの?

いつぞやのwatnowハッカソン終わって以来、毎週定期的に学校の図書館予約するようになった私。
でも
毎回図書館にアクセスして、
日にちを指定して、
教室を予約して、
予約できたらグループに報告。

この一連の流れを全部自動化できたらなあ!
っというのが今回の動機でした。目標でもありました。

しかしながら結果から言うと全部は無理でした。

今回は自分ができた『グループに報告』部分だけ紹介できたらなと思います。

作り方

自分が触ったことのある言語でスクレイピングしやすいのは無難にPythonかなという安直な考えで言語決定。

Chromeを起動

Chromeはこれだけで開きます。

from selenium import webdriver

driver = webdriver.Chrome()

簡単な人間なのでこれだけで感動しました。
実行してみたページがこちら。

image.png

あとはこれにURLを開くように指示したりどこのボタンを押させるように指示するだけ!

今回の手順としては
手順1: manabaログイン画面起動
手順2:ログイン情報を入力
手順3:利用予約教室野情報を取得
となっています。

htmlの指定

ところでボタンやinputタグのしてはどうやるの?と思う方もいると思います!
では、webの検証ツールを使ってみましょう。webサイトを開いてF12を押してみると出てくると思います。
出てこない方はMacOSならCommand+Shift+C WindowsならControl+Shift+Cで表示されると思います。
image.png
今回はこのUserIDとPasswordを自動で入力し、Sign Onボタンを押させたいですね。
ではUserIDとPasswordがどのタグなのかみてみましょう。
image.png
このような感じでカーソルを合わせるとタグやら属性がどこに記述されているかがわかると思います。
例として今回の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()

実行結果

image.png

これで完成となります!実際はこれをLineNotifyにのせて実行しているのですがそれは割愛します。

最後に

スクレイピングは過去にアクセス障害につながり逮捕に至った例があると聞きますね。
今回のスクレイピングは週一で手動実行でデプロイすらしていないので大丈夫だと信じつつ、違法の線引きをちゃんと確認しながら勉強している途中です。
稚拙な文章とぐちゃぐちゃなコードでしたが、最後まで見ていただきありがとうございました。
今も勉強中ですので、この分野の先輩方からたくさん指摘をもらえるとありがたいです。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1