前提・実現したいこと
pythonでスクレイピングを行い、レッスンのシート情報を取得したい
流れとしては、
- レッスンのsidを取得([ このURL ]から任意の店舗の任意のレッスンを選択し取得)
- マイページへid,passsを付与したpostを飛ばし、クッキーを取得
- [ このURL ]へ1,2で取得した sid, クッキー を付与してpostを飛ばし、シート情報が返ってくる
1については、すでに対応済みのため、スコープ外
試したこと
postmanを使い、3のリクエストに必要なリクエストヘッダを確認
結果、ログインした際のクッキーを保持しつつ、sidという変数を渡すことで結果が得られることが確認できた
(成功の場合シート番号が羅列されたhtmlが帰ってくる、失敗の場合「予約できないレッスンです。レッスンを選択し直してください」と表示される)
以下試したこと
- 下記ソースの通り、requests.Session()を使いpostを投げてみた ⇒ 失敗
- 一度クロームでログインした状態で、レッスンを選択し、デバックツールで渡しているクッキーの値を確認
ブラウザはそのままの状態で、クッキーの値を明示的に示して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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。