🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
スクレイピング

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

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

ログイン

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2721閲覧

formタグにonsubmitが指定されているログインフォームの内容を取得したい

Kanadekana_nana

総合スコア8

スクレイピング

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

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

ログイン

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/18 15:39

編集2021/01/20 03:57

したいこと

html

1<form name="form1" method="post" action="login.aspx" onsubmit="javascript:return WebForm_OnSubmit();" id="form1">

このような形式のログインフォームにpythonのrequestを使ってログインしたい。(url: http://xxxx.jp/xxxxx/login.aspx)
コードは勤務先で実際に使っているものなのであまり載せたくはないが、これ以外に必要な情報があるなら言ってください。

参考にしたもの

https://qiita.com/syunyo/items/36af8bcb501baf8c7014
この記事を参考に進めたがactionがフォーム送信のリンクになっておらず詰まってしまった。
onsubmitの関数を実行できればいいのだろうがやり方がわからない。

試したこと

seleniumを使ったら(当たり前だが)サクッとできた。けどrequestを使ったやり方が気になったため質問させていただきました。

追記

webform_OnSubmitの内容は以下の通りです

javascript

1function WebForm_OnSubmit() { 2if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false; 3return true; 4}

実行例

python

1session = requests.session() 2 3login_info = { 4 "txtLoginId": USER, 5 "txtPassword": PASS, 6 "param_in_input": PARAM 7} 8 9url_login = "https://xxxxxx.jp/xxx/login.aspx" 10res = session.post(url_login, data=login_info) 11res.raise_for_status() 12 13print(res.text)

これを実行すると元のページのHTMLが返ってきます

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

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

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

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

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

plasticgrammer

2021/01/19 00:16 編集

requestsでできることはHTTPリクエストの発行で、ブラウザのエミュレート的なこと(javascript実行)はできない認識です。 また、WebForm_OnSubmitの処理内容は確認できるのでしょうか。 その中でリクエストされる値の操作以外のことをしていると、requestsの処理ではできない気がします。 WebForm_OnSubmitの内容がわかるようでしたら追記をお願いします。
Kanadekana_nana

2021/01/19 08:19

返信ありがとうございます、コード追記しました。 処理内容はt/fを返す簡単なものでしたがそれでもjavascriptが使われてそうなので触れなさそうでしょうか?
plasticgrammer

2021/01/19 08:52

ValidatorOnSubmitの中身はまだ不明ですが、名前からすると単純な入力チェックかと思います。 その前提だとログインするために、onsubmitを動かすのは必須ではなさそうなので、単純にユーザー名とパスワードをPOSTで login.aspx に送ることでログイン後画面のレスポンスを得られるのではないでしょうか。 ※但し、CORSの制約によりできない可能性も高いです
Kanadekana_nana

2021/01/19 09:24

ログインページのurlがhttp://xxxx.jp/xxxxx/login.aspxで、actionもlogin.aspxなのでそれしても何も動かないんですよね。。。 そこで詰まってます。
plasticgrammer

2021/01/19 09:30

http://xxxx.jp/xxxxx/login.aspx に対して GETでログインページを初期表示、POSTでログイン処理 という挙動になっているものと考えられます。 > それしても何も動かない 動かないという状況について詳細を教えてください。 POSTの結果でエラーが返ってきているのでしょうか?それとも処理例外が発生しているとかでしょうか?
Kanadekana_nana

2021/01/20 03:46

実行例を追加しました。エラーこそ出ないものの期待したものが返ってこない感じです。
guest

回答1

0

ベストアンサー

form の後に input 要素がないですか? (ない場合もある)
あるなら、それを下記のような感じで request.post に渡してください。

params = {'userid': 'xxx', 'password': 'yyy'} res = requests.post("http://xxxx.jp/xxxxx/login.aspx", data=params)

あるいは別アプローチとして Chrome 等で F12 > Network タブを選んで、Chrome にて普通にログインを行い、どのようなリクエストが http://xxxx.jp/xxxxx/login.aspx に送られているか確認する手もあります。

投稿2021/01/19 14:54

編集2021/01/19 15:00
68user

総合スコア2022

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

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

Kanadekana_nana

2021/01/20 03:56 編集

formの中に3つくらいhiddenのinputがあったのでそれらをparamsに追加して試してみましたが結果は同じでした。 chromeのアプローチ試してみましたがWebResource.axd?... みたいなのがたくさん並んでました。こういう方面はあまり詳しくないのでよくわからないです。。。
68user

2021/01/20 04:08

F12 > Network を開いて login.aspx にアクセスしたら、Network タブ内に login.aspx の行が表示されているはずなので探してください。参考: https://smakoma.com/http-header-chrome.html 勤務先のシステムであるのでフォームの HTML・Javascript の内容を正確に開示できない、ということであれば、後はこれしか方法はないと思いますよ。
Kanadekana_nana

2021/01/20 04:19

Request Headers確認できました! 実際のプログラムは開示したくないのでこの方法で行きたいと思うのですが、何をプログラムに追加すればいいでしょうか?
68user

2021/01/20 04:57

Headers の「▼Form Data」というところを見ると、  txtLoginId: xxxx  txtPassword: yyyy  param_in_input: zzzz などとなっているのではと思いますので、それを login_info に転記して動かしてみる。 それでもダメなら、▼Request Headers の cookie を渡すように修正して動かしてみる。 参考: https://www.yoheim.net/blog.php?q=20170802#t9 ▼Query String Parameters は何もないと思いますが、もしあればご連絡を。 それでもダメなら、▼Request Headers のヘッダをひとつずつ増やしていく。 サーバ側が何をもとに認証しているのかわからないので、これとこれを追加すればできる、とは言えません。 ここから先「うまくいきません」という状態になった場合、あなた以外に Chrome で確認したリクエスト内容を見ることができないし試すこともできないので、アドバイスは難しいかもしれません。
Kanadekana_nana

2021/01/20 05:23

input要素が一つ抜けてたみたいです。そこ確認してparamに打ち込んだら無事ログインできました!丁寧にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問