ログインが必要なサイトをbeautifulsoupでスクレイピングしてみた
ログインが必要なサイトを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での通知が確認取れました。
ディスカッション
コメント一覧
まだ、コメントがありません