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

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

新規登録して質問してみよう
ただいま回答率
85.48%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

4066閲覧

python requestsでのスクレイピング

taichin3264

総合スコア9

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/08/13 00:38

前提・実現したいこと

pythonでスクレイピングを行い、レッスンのシート情報を取得したい

流れとしては、

  1. レッスンのsidを取得([ このURL ]から任意の店舗の任意のレッスンを選択し取得)
  2. マイページへid,passsを付与したpostを飛ばし、クッキーを取得
  3. [ このURL ]へ1,2で取得した sid, クッキー を付与してpostを飛ばし、シート情報が返ってくる

1については、すでに対応済みのため、スコープ外

試したこと

postmanを使い、3のリクエストに必要なリクエストヘッダを確認
結果、ログインした際のクッキーを保持しつつ、sidという変数を渡すことで結果が得られることが確認できた
(成功の場合シート番号が羅列されたhtmlが帰ってくる、失敗の場合「予約できないレッスンです。レッスンを選択し直してください」と表示される)

以下試したこと

  1. 下記ソースの通り、requests.Session()を使いpostを投げてみた ⇒ 失敗
  2. 一度クロームでログインした状態で、レッスンを選択し、デバックツールで渡しているクッキーの値を確認

ブラウザはそのままの状態で、クッキーの値を明示的に示してpostを投げた(requests.Session()は使わず) ⇒ 成功
0. .cookies でクッキー情報が取得できるようなので、取得し、それを明示的に示してpostを投げた ⇒ 失敗

postmanおよび2での結果により、クッキー情報とsidが必要なのはおそらく間違いなさそう
だが、1,3でなぜ失敗するのかがわからない

また、試しに3の際に.headdersでリクエストヘッダーを確認したところ、
クッキーで渡しているPHPSESSIDという値が、2つ返ってきていた これもよくわからない

該当のソースコード

Python

1import requests 2from bs4 import BeautifulSoup 3import pprint 4 5#ログイン用テストアカウント 6ID = 'python.3264@gmail.com' 7PASS = 'test1234' 8 9payload = { 10 'commit_login':'', 11 'login_id': ID, 12 'login_pass': PASS, 13} 14 15# クッキーを取得するために一度マイページへアクセスする 16URL_mypage = 'https://www.feelcycle.com/feelcycle_reserve/mypage.php' 17 18s = requests.Session() 19res = s.post(URL_mypage, data=payload, headers=headers) 20 21cookie01 = dict(res.cookies) 22head = dict(res.headers) 23 24 25# クッキーの確認 ※ \nはprintをみやすいように入力しているだけです 26print('\n#######################################################################\n') 27print('\ncoockie\n') 28pprint.pprint(cookie01, width=40) 29print('\n#######################################################################\n') 30print('\nheaders\n') 31pprint.pprint(head, width=40) 32print('\n#######################################################################\n') 33 34# 情報を取得したいurl 35URL_sheet = 'https://www.feelcycle.com/feelcycle_reserve/sheet.php' 36 37#2の際にブラウザで確認したクッキーを静的に示した 38CLOUDNLBA = '' 39PHPSESSID = '' 40authchallenge = '' 41 42correct_cookies={ 43 'CLOUDNLBA':CLOUDNLBA, 44 'PHPSESSID':PHPSESSID, 45 'authchallenge':authchallenge, 46} 47 48#/reserve.phpで取得したsid 49payload_sid = { 50 'sid': '243297' 51} 52 53#上記1,3で試したpost 54res02 = s.post(URL_sheet, data=payload_sid, cookies=cookie01) 55#上記2で試したpost 56res02 = requests.post(URL_sheet, data=payload_sid, cookies=correct_cookies) 57 58#返ってきたhtmlの確認 59soup = BeautifulSoup(res02.content, 'lxml') 60print(soup.text) 61 62

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

上記の通り、シート情報を取得するには、ログインした状態を維持したまま(=クッキーを持ったまま)
/feelcycle_reserve/sheet.php へポストを飛ばす必要があるはずですが、そのクッキーをもったままというのが、再現できません。

コード的には、あっている気がするので、そもそも最初にマイページにアクセスするときに取得したクッキーが無効なんでしょうか。
(ポストの送り方が悪いなど・・・?)

必死に考えましたが、これ以上は手詰まりなので、ぜひお知恵を貸してください。
よろしくお願いいたします。

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

・python 3.6.5
・beautifulsoup 4.6.0
・requests 2.18.4

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

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

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

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

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

guest

回答1

0

試してませんが、「Session PHPSESSID requests login」でググると
python-requests-logging-into-website-using-post-and-cookies

あとは、seleniumとかでも同様の処理ができそうな気もします。

投稿2018/08/15 01:56

編集2018/08/15 02:04
umyu

総合スコア5846

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問