Python

自分の登録サイトにログインして特定のページの値を取得する方法

今回は自分が登録しているサイトのログインページにアクセスしてログインして適当なページのURLを取得する方法のメモになります。

注意点

ログインページにreCAPTCHAがある場合は対応していません。

requestsライブラリとbeautifulsoup4ライブラリをインストール

下記のコマンドを叩きます。

pip install requests
pip install beautifulsoup4

requestsライブラリは主に下記のことができます。

  • WebページのHTMLやJSONデータを取得(requests.get())
  • フォームを送信(requests.post())
  • セッションを維持(requests.Session())

今回は上記の3つを使います。

beautifulsoupは主に下記のことができます。

  • HTMLやXMLを解析して、特定の要素を抽出
  • フォームの入力値(例:CSRFトークン)を取得

今回は上記の2つを使います。

requestsライブラリ・beautifulsoupライブラリを使う為の記述

下記の記述をします。

import requests
from bs4 import BeautifulSoup

sessionを使えるようにする

ページ遷移をした時に情報を維持しないといけないのでsessionを使えるようにします。

下記の記述をします。

import requests
from bs4 import BeautifulSoup

session = requests.Session()            //この行を追加

ヘッダーの記述

これがないとログインができないみたいです。

下記の記述をします。

import requests
from bs4 import BeautifulSoup

session = requests.Session()


//ここから追加
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", 
    "Referer": "ログインページのURL"
}
//ここまで追加

9行目はどのブラウザやデバイスからのアクセスかを判定します、一部のサイトではこれがないとアクセスを拒否される場合があるみたいです。

10行目は一部のサイトではサイトのログインページからログインしないとアクセスを拒否されるのですがこの記述があることでサイトのログインページからログインしようとしているのを伝えることができます。

ログインページにアクセスしてHTMLを取得

下記の記述をします。

import requests
from bs4 import BeautifulSoup

session = requests.Session()

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", 
    "Referer": "ログインページのURL"
}


//ここから追加
login_url = "ログインページのURL"
response = session.get(login_url, headers = headers) 
soup = BeautifulSoup(response.text, 'html.parser')
//ここまで追加

14行目でログインページにアクセスして15行目でログインページのHTMLを取得しています。

「response.text」が取得したHTMLでhtml.parseはHTMLを解析するエンジンです。

csrfトークンの取得

csrfトークンは不正アクセスを防ぐ為に必要になります。

下記の記述をします。

import requests
from bs4 import BeautifulSoup

session = requests.Session()

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", 
    "Referer": "ログインページのURL"
}

login_url = "ログインページのURL"
response = session.get(login_url, headers = headers) 
soup = BeautifulSoup(response.text, 'html.parser')


//ここから追加
csrf_token_tag = soup.find('input', {'name': '_token'})   

if csrf_token_tag:
    csrf_token = csrf_token_tag['value']
else:
    csrf_token = None
    exit()
//ここまで追加

17行目はHTMLの中で「name=”_token”」を持つinputタグを探して20行目でcsrfトークンを取得します。

ログイン

ログインできるようにします。

ログインに使うのは今回はメールアドレスとパスワードです。(サイトによって異なると思います)

下記の記述をします。

import requests
from bs4 import BeautifulSoup

session = requests.Session()

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", 
    "Referer": "ログインページのURL"
}

login_url = "ログインページのURL"
response = session.get(login_url, headers = headers) 
soup = BeautifulSoup(response.text, 'html.parser')

csrf_token_tag = soup.find('input', {'name': '_token'})   

if csrf_token_tag:
    csrf_token = csrf_token_tag['value']
else:
    csrf_token = None
    exit()


//ここから追加
payload = {
    "email": "ログインユーザーのメールアドレス",
    "password": "ログインユーザーのパスワード",
    "_token": csrf_token
}

session.post(login_url, data = payload, headers = headers)
//ここまで追加

25行目〜29行目はログインに使う情報です。

26行目はメールアドレスで27行目はパスワードで28行目はcsrfトークンです。

ログイン後に特定のページのURLを取得

今回は特定のページのURLを取得します。

下記の記述をします。

import requests
from bs4 import BeautifulSoup

session = requests.Session()

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36", 
    "Referer": "ログインページのURL"
}

login_url = "ログインページのURL"
response = session.get(login_url, headers = headers) 
soup = BeautifulSoup(response.text, 'html.parser')

csrf_token_tag = soup.find('input', {'name': '_token'})   

if csrf_token_tag:
    csrf_token = csrf_token_tag['value']
else:
    csrf_token = None
    exit()

payload = {
    "email": "ログインユーザーのメールアドレス",
    "password": "ログインユーザーのパスワード",
    "_token": csrf_token
}

session.post(login_url, data = payload, headers = headers)


//ここから追加
mypage_url = "ログイン後にアクセスしたページのURL"
response = session.get(mypage_url, headers = headers)
print("ログイン後のページURL:", response.url)
//ここまで追加

これで完成です。