質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

1回答

1144閲覧

ログインつきサイトのスクレイピング

LEPIDOPTERA

総合スコア2

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

2クリップ

投稿2022/10/01 00:51

編集2022/10/01 23:29

前提

https://web-m.cc.oita-u.ac.jp/cgi-bin/htmlparse.cgi?html=sessionout.html&lang=
上記のサイトでスクレイピングをしようと思っているのですが、HTMLでアクセストークンを見つけ出すことができませんでした。

実現したいこと

当サイトのスクレイピング

発生している問題・エラーメッセージ

トークンなしでは実行してもログイン先のHTMLを見ることができませんでした。

<html> <head> <meta content="No-Cache" http-equiv="Pragma"/> <meta content="Wed, 01-01-90 00:00:00 GMT" http-equiv="Expires"/> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <title>大分大学メールシステム(DEEPMail)</title> <link href="../favicon.ico" rel="shortcut icon"/> </head> <frameset border="0" cols="*,0,0" frameborder="no" framespacing="0"> <frame name="content" scrolling="NO" src="topframe.cgi?focus= &lt;!-- Error Occured : Failed to operate left operand --&gt; @if(&amp;SESSION_initpageopt==0);home@end_if;"/> <frame name="process" noresize="" scrolling="NO" src="../blank.html"/> <frame name="notinewmail" noresize="" scrolling="NO" src="notinewmail.cgi"/> </frameset> <noframes> <body bgcolor="#FFFFFF" text="#000000"> </body> </noframes> </html>

該当のソースコード

python

1import requests 2from bs4 import BeautifulSoup 3import re 4import pandas as pd 5 6USER = "*********" 7PASS = "*********" 8 9# 1.ログインページにアクセスする 10url_login = "https://web-m.cc.oita-u.ac.jp/cgi-bin/index.cgi" 11session = requests.session() 12# ログインページへのアクセス完了 13req_before_login = session.get(url_login) 14 15# ログインするための情報を準備する 16login_data = { 17 "domain": 'oita-u.ac.jp', 18 "ismultisite": '', 19 "chglang": '', 20 "lang": '', 21 "id": USER, 22 "pwd": PASS,} 23 24# ログインするためにトークンが必要となるため情報を取得 25bs = BeautifulSoup(req_before_login.text, 'html.parser') 26csrf_token = bs.find( 27 attrs={'name':'不明'}).get('value') 28login_data['不明'] = csrf_token 29 30# 2. ログインページで認証を行い、管理者ページへ遷移する 31req_after_login = session.post(url_login, data=login_data) 32 33# 3. 認証完了後のページで他ページへ遷移を行う 34url_group = 'https://web-m.cc.oita-u.ac.jp/cgi-bin/htmlparse.cgi?html=frame.html' 35req_group = session.get(url_group) 36soup = BeautifulSoup(req_group.text, 'lxml')

試したこと

他の大学関連サイトでは「logintoken」という名前のものが見つかったので上記のコードでうまくできたのですが、当サイトではそれらしきものが見当たらず、解決できませんでした。

補足情報(FW/ツールのバージョンなど)

MacOS Monterey バージョン 12.5.1

当該サイトの利用規約は確認いたしました。
スケジュール実行で1時間に一度、接続する予定です。

デベロッパツールのスクリーンショット
イメージ説明

レスポンスヘッダのスクリーンショット
イメージ説明

イメージ説明

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/10/01 01:33 編集

スクレイピングって安易に書いてるけど、対象サイトの管理者に許可は得ているのですか? クローラを作って某図書館のサイトにアクセスしたら業務妨害で逮捕された事例もありますので、安易に考えない方がいいですよ。
LEPIDOPTERA

2022/10/01 02:30 編集

コメントありがとうございます。 librahack 事件のことですね。 利用規約等は事前に確認しております(補足情報に追加しておくべきでした、申し訳ございません)。 また、サーバーへの負荷はできるだけ軽減して行う予定です(1時間に1回のHTTP接続*)。 ※大学のメールサイトを開いて確認するのに時間がかかっていたので、1時間に1度スクレイピングするようにして、LINEに自動送信されるようなコードを作ろうと思っております。 スクレイピング、慎重に行いたいと思います、ご指摘のほどありがとうございました。
退会済みユーザー

退会済みユーザー

2022/10/01 02:53

> 利用規約等は事前に確認しております(補足情報に追加しておくべきでした、申し訳ございません)。 それで許可されたことになるのか分かりませんが、許可されているなら質問本文にその旨書いておいてはいかがですか。 でも・・・ どこの誰だかわからない人が「クローラ作ってアクセスしていいですか?」と聞いてきたら、No という答えが返ってくると思うのですが。悪意が無くてもミスで無限ループで要求がかかるかもしれませんし。
LEPIDOPTERA

2022/10/01 03:44 編集

おっしゃる通りですね・・・。 できるだけミスは起こらないように、、とは思っているのですが、絶対に起こらないとは限らないですね・・。 コードを実行する前に、念の為、他の人にチェックしてもらうように頼んだりしてみます・・。 > それで許可されたことになるのか分かりませんが、許可されているなら質問本文にその旨書いておいてはいかがですか。 補足情報に追記しておきました。
guest

回答1

0

ベストアンサー

アクセストークンが見当たらないとのことですが、アクセストークンがCSRFトークンのことであれば、確かにないようです。なければ単にCSRFトークンを送信しなければ良いだけのことであり、無理に探す必要はありません。
当該サイトは誰でも会員登録できるものではないので、質問するとしたらアカウントを持っている先生や学生などでないと、回答は難しいと思います。

投稿2022/10/01 09:37

編集2022/10/01 13:33
ockeghem

総合スコア11697

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LEPIDOPTERA

2022/10/01 10:35 編集

ご回答ありがとうございます。 初めての質問でしたので、感激です。 > アクセストークンを送信しなければ良い アクセストークンを送信しないとなると、ユーザー名とパスワードのみで可能ということでしょうか・・。 Cookieの発行は必要ないのでしょうか?  inputタグのvalueを辞書型で変数に入れてpostしてみましたが、どうもうまくいきません、、、。 また普通にログインした時に、デベロッパーツールを確認してみると、下記のようになっていました。 どこで何が引っ掛かっているのかが全くわからない状態です、、。 (login.cgi) domain: oita-u.ac.jp ismultisite: chglang: lang: id: ******* pwd: ****** ※質問文の補足情報に写真を追加しておきます。 > アカウントを持っている人でないと回答は難しい 工学部の同級生に聞いても、解決しませんでした・・・。 無理を承知で質問しています・・。解決せずとも、少しでも勉強になれば嬉しいです。
ockeghem

2022/10/01 10:39

Cookieはサーバーから送られてきたものを返すので、意図的に特定のCookieを送信する必要はありません。
LEPIDOPTERA

2022/10/01 10:57 編集

返信ありがとうございます。 それでは、実行がうまくいかない原因としては何が挙げられるのでしょうか・・。 漠然とした質問で申し訳ないです。
ockeghem

2022/10/01 12:06

えっと、実行結果を示してもらってないですよね…
LEPIDOPTERA

2022/10/01 12:13 編集

実行にエラーが生じているというわけではないのですが、print(soup)とした時に、ログイン先のHTML構造を見ることができず、質問内容の "発生している問題" にあるHTMLが表示されます。
ockeghem

2022/10/01 12:14

レスポンスヘッダはどうなりますか?
LEPIDOPTERA

2022/10/01 12:20

補足情報に追記いたしました。
ockeghem

2022/10/01 12:27

これ、ブラウザで実行した際のレスポンスヘッダではないですか?
LEPIDOPTERA

2022/10/01 12:36

はい、手動で表示させたものをスクリーンショットしていました。 Pythonで取得できるのですね、無知でした。 補足情報のスクリーンショットをPython で実行したものに置き換えしました。
ockeghem

2022/10/01 13:00

全然別のスクリプトになっていますね。これではだめです。元々のスクリプトを以下のように修正して試してください。 req_after_login = session.post(url_login, data=login_data) // この行の後ろに以下を追加 print(req_after_login.status_code, req_after_login.headers)
LEPIDOPTERA

2022/10/01 13:08 編集

ありがとうございます、修正してみました。 補足情報に書き足しました。
ockeghem

2022/10/01 13:26

これ、多分正常に処理されています。frameのどれかにコンテンツが返っていると思います。
ockeghem

2022/10/01 13:32

デバッグのテクニックの一つとして、パスワードをわざと間違って結果が変わるかどうかを調べるという方法があります。
LEPIDOPTERA

2022/10/01 14:16 編集

すいません、少し手こずっていました。 src属性があるframeタグは3つありました。 そのsrcをURLの一部を書き換えて、printしてみました。 (この時点でやり方が間違っていたらすいません・・) contentの名前を含むframeタグは404 Not Foundでした(パスワードを変えても同じでした)。 (追記)よくみたら、urlが間違っていると書かれていますね、少し考えてみます。 ブラウザでログイン先のHTMLを見てみたところ、欲しい情報はcontentを含むframeタグに含まれていました。 スクリーンショットを補足情報に追加いたしました。
ockeghem

2022/10/01 14:23

Teratailはデバッグ代行ではないので、そろそろおしまいにしましょう。自力で頑張って、わからないところは別の質問として投稿してください
LEPIDOPTERA

2022/10/01 14:29

はい もうここまでできたら、自分でもできそうです! contentは模索中ですが、他のリンクを入れてみるとうまくできました。 本当にありがとうございました。 後々気がついたのですが、とても著名な方だったのですね。 驚きました、お時間を割いていただき、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問