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

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

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

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

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

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

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

# 作り方

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

### Chromeを起動
Chromeはこれだけで開きます。
```python
from selenium import webdriver

driver = webdriver.Chrome()
```

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630545/8ffebd6b-0069-ca81-9a9c-d7b1336ad6e4.png)

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

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

##  htmlの指定
ところでボタンやinputタグのしてはどうやるの？と思う方もいると思います！
では、webの検証ツールを使ってみましょう。webサイトを開いて`F12`を押してみると出てくると思います。
出てこない方はMacOSなら`Command+Shift+C` Windowsなら`Control+Shift+C`で表示されると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630545/91f91673-1f6f-9846-9c32-6d95da74a4c1.png)
今回はこのUserIDとPasswordを自動で入力し、Sign Onボタンを押させたいですね。
ではUserIDとPasswordがどのタグなのかみてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630545/d7aa7b57-d992-e344-7ea3-443c7b87804e.png)
このような感じでカーソルを合わせるとタグやら属性がどこに記述されているかがわかると思います。
例として今回のUserIDは
```html
<input type="text" name="USER" id="User_ID" class="input">
```
と言うタグであることがわかると思います。
このタグはname属性が`USER`となっているので`find_element`関数で`name`を指定しあげます。
```python
driver.find_element_by_name("USER")
```
Seleniumの構文に関しては[こちら](https://www.selenium.dev/ja/documentation/webdriver/elements/)を参照ください。
これらのコードを繋ぎ合わせると
```python
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秒待機
```
#### これでログインできるようになりました!
あとは自分の予約した情報を取得して文章を整理して完成！

出来上がったものがこちら笑
```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630545/8cf81e0e-a351-dd50-8e77-fe6b7daa7654.png)

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

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