ログインのあるWebサイトからのスクレイピング


はじめに

ログインがあるWebサイトの情報をスクレイピングで取ってくることがあって、少し大変だったので自分の備忘録もかねて記事にしてみました。
今回は訳あってSeleniumが使えなかったので requestsBeautifulSoup を使って行っています。

手順

ログインするために必要なパラメータの確認

まずログイン前のURLを取ってきてそのHTML要素を確認します。

import requests
from bs4 import BeautifulSoup

# ログイン前のurl
login_url = "{url}"
response = requests.get(login_url)
soup = BeautifulSoup(response.text, 'lxml')

soupの中のformタグ部分に注目して、
そこのinputタグに含まれる、nameに格納されている値が
パラメータのキーで、実際の入力値が値になります。

soup

<form action="https://~" class="mt-3" id="login" method="post">
<input id="anchor" name="anchor" type="hidden" value=""/>
<script>document.getElementById('anchor').value = location.hash;</script>
<input name="logintoken" type="hidden" value="qCiEJuqAlux7qVABUVgqAmBfkCUjLcNT"/>
<div class="form-group">
<label class="sr-only" for="username">
                                    ユーザ名
                            </label>
<input autocomplete="username" class="form-control" id="username" name="username" placeholder="ユーザ名" type="text" value=""/>
</div>
<div class="form-group">
<label class="sr-only" for="password">パスワード</label>
<input autocomplete="current-password" class="form-control" id="password" name="password" placeholder="パスワード" type="password" value=""/>
</div>
<div class="rememberpass mt-3">
<input id="rememberusername" name="rememberusername" type="checkbox" value="1"/>
<label for="rememberusername">ユーザ名を記憶する</label>
</div>
<button class="btn btn-primary btn-block mt-3" id="loginbtn" type="submit">ログイン</button>
</form>

ログインする

session = requests.session()
payload = {
  "username": "{ユーザー名}",
  "password": "{パスワード}",
  "rememberusername": 1,
  "loginbtn": "ログイン"
}
r = session.post(login_url, data=payload)
soup = BeautifulSoup(r.content, "lxml")

ログインするためにはログインボタンをクリックする動作を表すパラメータが必要なので、
bottonタグに含まれる、キーを表すidログインという値を含ませます。

このsoupの中にはログイン後のサイトの情報を表すHTMLが格納されています。

終わりに

ログインするために必要なパラメータを見つけ出すのがとても大変でした😓
少しでも同じような状況の人の助けになってくれたらうれしいです!