環境構築からWEBアプリ開発・スマホアプリ開発まで。ときには動画制作やゲームも。

supilog
すぴろぐ

【PythonでWEBスクレイピング】ログインが必要な情報を取得する

【PythonでWEBスクレイピング】ログインが必要な情報を取得する

今回は、ログイン後のWEBサイトの情報を取得してみることにする。

必要な情報を調べる

ログイン後のWEBページを取得するためには、ログイン処理を実装しなければならない。その準備として、ログイン時にどのようなパラメータが送信されているかを知る必要がある。IDやパスワードのような値はもちろんのこと、tokenのような隠された値が必要になることも多い。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<form name="loginform" id="loginform" method="post" action="/login">
<input type="text" name="log" id="user_login" class="input" value="" size="20" autocapitalize="none"
autocomplete="username" required="required">
<input type="password" name="pwd" id="user_pass" class="input password-input" value="" size="20"
autocomplete="current-password" spellcheck="false" required="required">
<input name="rememberme" type="checkbox" id="rememberme" value="forever"> <label
for="rememberme">ログイン状態を保存する</label>
<input type="submit" name="submit" id="submit" class="button button-primary button-large" value="ログイン">
</form>
<form name="loginform" id="loginform" method="post" action="/login"> <input type="text" name="log" id="user_login" class="input" value="" size="20" autocapitalize="none" autocomplete="username" required="required"> <input type="password" name="pwd" id="user_pass" class="input password-input" value="" size="20" autocomplete="current-password" spellcheck="false" required="required"> <input name="rememberme" type="checkbox" id="rememberme" value="forever"> <label for="rememberme">ログイン状態を保存する</label> <input type="submit" name="submit" id="submit" class="button button-primary button-large" value="ログイン"> </form>
<form name="loginform" id="loginform" method="post" action="/login">
    <input type="text" name="log" id="user_login" class="input" value="" size="20" autocapitalize="none"
        autocomplete="username" required="required">
    <input type="password" name="pwd" id="user_pass" class="input password-input" value="" size="20"
        autocomplete="current-password" spellcheck="false" required="required">
    <input name="rememberme" type="checkbox" id="rememberme" value="forever"> <label
        for="rememberme">ログイン状態を保存する</label>
    <input type="submit" name="submit" id="submit" class="button button-primary button-large" value="ログイン">
</form>

このようなログインフォームであったとする。余計な情報がまだ多いので、さらに削ぎ落としたものがこちら。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<form method="post" action="/login">
<input name="log" required="required">
<input name="pwd" required="required">
<input name="rememberme" type="checkbox">
<input type="submit" name="submit" value="ログイン">
</form>
<form method="post" action="/login"> <input name="log" required="required"> <input name="pwd" required="required"> <input name="rememberme" type="checkbox"> <input type="submit" name="submit" value="ログイン"> </form>
<form method="post" action="/login">
    <input name="log" required="required">
    <input name="pwd" required="required">
    <input name="rememberme" type="checkbox">
    <input type="submit" name="submit" value="ログイン">
</form>

「log」「pwd」がIDPASSWORD。「rememberme」がログイン状態を保存しますか?というチェックボックス。「submit」はログインボタンそのものだ。これらの値があればログイン出来そうだという目処をつける。

ではPythonに戻ろう。

ログイン処理の実装

先ほど、調べた必要な値を使って、ログインを実装する。本ブログのログインを利用してログイン可能か試してみた。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
from bs4 import BeautifulSoup
import requests
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'
}
url_login = "https://supilog.supisupi.com/wp-login.php"
url="https://supilog.supisupi.com/wp-admin/edit.php"
session = requests.session()
payload = {
"log": "Supi",
"pwd": 'hogehoge',
"rememberme": 0
}
response = session.post(url_login, data=payload)
response.raise_for_status()
response = session.get(url)
soup = BeautifulSoup(response.text, "html.parser")
titles = soup.select('#the-list tr .row-title')
for title in titles:
print(title.text)
from bs4 import BeautifulSoup import requests headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36' } url_login = "https://supilog.supisupi.com/wp-login.php" url="https://supilog.supisupi.com/wp-admin/edit.php" session = requests.session() payload = { "log": "Supi", "pwd": 'hogehoge', "rememberme": 0 } response = session.post(url_login, data=payload) response.raise_for_status() response = session.get(url) soup = BeautifulSoup(response.text, "html.parser") titles = soup.select('#the-list tr .row-title') for title in titles: print(title.text)
from bs4 import BeautifulSoup
import requests

headers = {
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36'
}

url_login = "https://supilog.supisupi.com/wp-login.php"
url="https://supilog.supisupi.com/wp-admin/edit.php"
session = requests.session()

payload = {
    "log": "Supi",
    "pwd": 'hogehoge',
    "rememberme": 0
}

response = session.post(url_login, data=payload)
response.raise_for_status()

response = session.get(url)

soup = BeautifulSoup(response.text, "html.parser")
titles = soup.select('#the-list tr .row-title')

for title in titles:
    print(title.text)
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
【PythonでWEBスクレイピング】ヘッダ情報を付与する
【PythonでWEBスクレイピング】基本の使い方
【ルービックキューブのタイマーを作る】第9回 キューブの展開図にスクランブル情報を適用させる回
【ルービックキューブのタイマーを作る】第8回 グラフ化してみる回
【ルービックキューブのタイマーを作る】第7回 保存した記録を表示する回
【ルービックキューブのタイマーを作る】第6回 IndexedDBでタイムを保存してみる回
【ルービックキューブのタイマーを作る】第5回 IndexedDBを使ってみる回
...
【PythonでWEBスクレイピング】ヘッダ情報を付与する 【PythonでWEBスクレイピング】基本の使い方 【ルービックキューブのタイマーを作る】第9回 キューブの展開図にスクランブル情報を適用させる回 【ルービックキューブのタイマーを作る】第8回 グラフ化してみる回 【ルービックキューブのタイマーを作る】第7回 保存した記録を表示する回 【ルービックキューブのタイマーを作る】第6回 IndexedDBでタイムを保存してみる回 【ルービックキューブのタイマーを作る】第5回 IndexedDBを使ってみる回 ...
【PythonでWEBスクレイピング】ヘッダ情報を付与する
【PythonでWEBスクレイピング】基本の使い方
【ルービックキューブのタイマーを作る】第9回 キューブの展開図にスクランブル情報を適用させる回
【ルービックキューブのタイマーを作る】第8回 グラフ化してみる回
【ルービックキューブのタイマーを作る】第7回 保存した記録を表示する回
【ルービックキューブのタイマーを作る】第6回 IndexedDBでタイムを保存してみる回
【ルービックキューブのタイマーを作る】第5回 IndexedDBを使ってみる回

...

まとめ

ログイン後のソースコードから情報を取得することができました。ログイン処理等が実装できると、出来ることの幅が増えますね。

必要なパラメータを調査する作業が重要な点で、JavaScriptでログイン処理が実装されてたりする場合には、少し頑張って探す必要はありそうですね。