ログインが必要なサイトをbeautifulsoupでスクレイピングしてみた

2020年12月21日

ログインが必要なサイトをbeautifulsoupでスクレイピングしてみた

今回はbeautifulsoupにてNinjaAdmaxにアクセスしログイン後にポイント残高を取得してslackに通知するところまでやってみたいと思います。

以前はseleniumでログインする機能を作ったりしてみたのですが、何度かクラッシュしてしまいました。と言う事で調べていたらbeautifulsoupでも出来たみたいですね。
それでは早速やってみましょう。

画面遷移

ログイン画面は下の通りです。
ユーザー情報を入力してログインボタンを押します。

ログイン後の画面は下の通りです。
右下にある「8,124」とある値を抜き取ってslackに送ってみます。

参考:
  ・【Python3】ログイン機能付サイトでスクレイピング【requests】【BeautifulSoup】
スクレイピング

  ・Python3 requestsを使ってログインする
  ・RequestsでSessionモード
  ・pythonでslackに通知してみた

プログラム

プログラムは下の通りです。
参考にさせて頂いたこちらの方と同様に「token」と「cookie」をpostしてサーバーに情報を送ってあげないといけないみたいです。
「token」の取得をしているのが「HASH = soup.find(attrs={'name':'hash'}).get('value')」にあたる部分です。
「cookie」の取得をしているのが「response_cookie = response.cookies」にあたる部分です。
※try&exceptが単純すぎますがお許しください。


import requests
import time
import slackweb
from bs4 import BeautifulSoup

slack = slackweb.Slack(url="https://hooks.slack.com/xxxxxxxxxx")

try:
    #session開始
    session  = requests.session()
    response = session.get('https://www.ninja.co.jp/login/')
    soup     = BeautifulSoup(response.text, 'html.parser')

    #ユーザー情報の指定とトークンの取得
    USER = 'your_email@gmail.com'
    PASS = 'your_password'
    HASH = soup.find(attrs={'name':'hash'}).get('value')
    login_data = {
        'email'   :USER,
        'password':PASS,
        'hash'    :HASH,
    }

    #クッキーの取得
    response_cookie = response.cookies

    #遷移先であるactionのURLを指定
    login_url = 'https://www.ninja.co.jp/auth'

    #上記の情報を元にログイン実行
    admin_page = session.post(login_url , data=login_data, cookies=response_cookie)
    time.sleep(2)

    #ログイン後の画面から情報を取得
    soup = BeautifulSoup(admin_page.text, 'html.parser')
    point = soup.find(attrs={'class':'getPoint'}).string

except:
    #slackに通知
    slack.notify(text='ERRORが発生しました')
else:
    #slackに通知
    slack.notify(text='NinjaAdmaxのポイントは'+point+'です')

ログイン画面のHTML

ログイン画面をchromeのdeveloperツールで表示し「<form>~</form>」を抜き取ったものが下の通りです。
ここから取得する必要がある情報は下記2点です。
1.「<input type="hidden" name="hash" value="7f8cf23d42475bbf5d9589cb5abf50ec" id="hash"> 」の「value」の値
2.「<form action="https://www.ninja.co.jp/auth" method="post" _lpchecked="1">」の「action」の値


<form action="https://www.ninja.co.jp/auth" method="post" _lpchecked="1">
    <!-- div.contents -->
    <input type="hidden" name="recaptcha_response" id="recaptchaResponse" value="03AGdBq27PKO-f98VkU4ILVFUKe8OJd8_qm0RoeEGqFt-HZnl8Qs8MTk8dBSYS_SRoFx0FLCteojlbO0r5eXdUJlDJMVA0aQkkRSTws3Lw6Sl7KaIDaXRigE5AUpRejGMExW5aAchN-oNJKL8RGvuQlyP0sfzM2P4qfO_IAD2QjYCuzBUrwQNlBbw5egqedjg-Sl4-PpeqqGOjbt_mJUWPoLsWx-DddGZgtakzdjwVdE5CKkQAf-xG-rT31TNHJVdFIbIZp1Djc_tPLhKFJ5xERUpjvjOq7o3BCt0CFjf8JqUDmVIKLU40yzLebMUCZpCTaOD-FiMJYB91w6gDq6DKScFB4qBPAY6nblsxQcvbYCA_NPFr6mV6xik8ToZNuDauadHu0JUYHLyy">
    <div class="contents">
        <h2>忍者ツールズアカウントでログイン</h2>
        <!-- div.contents_inner -->
        <div class="contents_inner">
            <div class="errorArea">
                                                                                                </div>
            
<input type="hidden" name="hash" value="7f8cf23d42475bbf5d9589cb5abf50ec" id="hash">                        <div class="input-login">
                <p><span class="bold">ID<span class="txtGrey">(メールアドレス)</span>:</span>
<input type="text" name="email" id="email" value="" class="text" size="25" style="background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=");"></p>
                <p><span class="bold">パスワード:</span>
<input type="password" name="password" id="password" value="" class="text" size="25" style="background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=");"></p>
            </div>
                                    <div class="btn-login"><input type="image" src="/images/login/btn-login.gif" alt="ログイン"></div>
        </div>
        <!-- /div.contents_inner -->

        <h2>サービスアカウントでログイン</h2>
        <!-- div.contents_inner -->
        <div class="contents_inner">
            <div class="btn-serviceID">
                <ul>
                    <li><a class="service_loading" rel="google" href="/auth/external?provider=google&return_to="><img src="/images/login/btn-google.gif" alt="googleアカウントでログイン"></a></li>
                    <li><a class="service_loading" rel="facebook" href="/auth/external?provider=facebook&return_to="><img src="/images/login/btn-facebook.gif" alt="facebookアカウントでログイン"></a></li>
                    <li class="last"><a class="service_loading" rel="twitter" href="/auth/external?provider=twitter&return_to="><img src="/images/login/btn-twitter.gif" alt="twitterアカウントでログイン"></a></li>
                </ul>
                <div class="clear"></div>
                <div id="service_loading" style="display:none;"><img src="/images/login/preload.gif" alt="loading"></div>
            </div>
        </div>
        <!-- /div.contents_inner -->
    </div>
    <!-- /div.contents -->

    <!-- div.contents -->
    <div class="contents">
        <h2>忍者ツールズのIDをお持ちでない方</h2>
        <!-- div.contents_inner -->
        <div class="contents_inner">
            <p>
                忍者ツールズのサービスを利用するにはユーザー登録(無料)が必要です。<br>
                こちらから新規ユーザー登録を行ってください。
            </p>
            <div class="btn-register"><a href="/register/?return_to="><img src="/images/login/btn-register.gif" alt="新規会員登録"></a></div>
        </div>
        <!-- /div.contents_inner -->
    </div>
    <!-- /div.contents -->

    
<input type="hidden" name="return_to" value="" id="return_to">                
<input type="hidden" name="no_login" value="" id="no_login">                
<input type="hidden" name="service" value="" id="service">                
<input type="hidden" name="internal" value="1" id="internal">
</form>

ログイン後の画面のHTML

ログイン後の画面で必要なHTMLは、ポイントの記載がある下の部分です。


<span class="getPoint">8,124</span>

実行結果

下の通りslackでの通知が確認取れました。

2020年12月21日