🐍
ログインのあるWebサイトからのスクレイピング
はじめに
ログインがあるWebサイトの情報をスクレイピングで取ってくることがあって、少し大変だったので自分の備忘録もかねて記事にしてみました。
今回は訳あってSelenium
が使えなかったので requests
と BeautifulSoup
を使って行っています。
手順
ログインするために必要なパラメータの確認
まずログイン前の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が格納されています。
終わりに
ログインするために必要なパラメータを見つけ出すのがとても大変でした😓
少しでも同じような状況の人の助けになってくれたらうれしいです!
Discussion