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

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

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

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

Q&A

1回答

4251閲覧

pythonでrequests.post()した時に500ServerErrorが出てしまう

JPYJPY

総合スコア19

Python

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

0グッド

0クリップ

投稿2022/01/06 02:39

編集2022/01/06 05:25

前提・実現したいこと

######■前提
pythonで自社ECサイト(eccube)の受注データのcsvダウンロードを自動化したいと思っています。
以前自分で作成した、別サイトからのマスタデータのcsvダウンロードのPythonプログラムでうまくいった方法を流用して書いていたのですが、
以下のエラーメッセージが発生し、試行錯誤したのですが解決方法が分からず、質問させていただきました。

初回作成時は、以下サイトを参考にさせて頂きました。
https://gb-j.com/column/post-1911/

######■実現したいこと
pythonのrequestsを使って、
0. ECサイト管理ページに管理者アカウントでログイン
0. 対象受注データを期間(一週間前~今日)で指定して、csvダウンロードをリクエスト
0. csvファイルに名前を付けてフォルダ保存

今回は、2の時点で発生している500エラーの対応方法を教えていただきたいですm()m

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

Traceback (most recent call last): File "\[ローカルフォルダパス]\Python\dlEcOrder.py", line 152, in <module> res.raise_for_status() # 4 File "C:\Users[ローカルフォルダパス]\AppData\Roaming\Python\Python310\site-packages\requests\models.py", line 953, in raise_for_status raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 500 Server Error: Internal Server Error for url: https://[対象ECサイトドメイン]/admin/order/

該当のソースコード

Python

1#!python3 2# ECサイトから受注データをDL 3# pip install requests 4# pip install BeautifulSoup4 5# pip install datetime 6 7 8# モジュール読み込み 9import requests 10from bs4 import BeautifulSoup 11import datetime 12from datetime import date, timedelta 13import time 14 15 16#日付情報を準備 17today = datetime.date.today() 18t_year = str(today.year) 19t_month = str(today.month) 20t_day = str(today.day) 21 22a_week_ago_today = today + timedelta(weeks=-1) 23a_year = str(a_week_ago_today.year) 24a_month = str(a_week_ago_today.month) 25a_day = str(a_week_ago_today.day) 26 27 28# ログインページのURLから、BeautifulSoupオブジェクト作成 29url = "https://[対象ECサイトドメイン]/admin/" 30session = requests.session() 31response = session.get(url) 32bs = BeautifulSoup(response.text, 'html.parser') 33 34 35# クッキーとトークンを取得 36authenticity = bs.find(attrs={'name':txid'}).get('value') 37cookie = response.cookies 38 39 40# ログイン情報 41info = { 42 "txid": authenticity, 43 "mode": "login", 44 "loginid": "login", 45 "loginpasswd": "login", 46} 47 48 49# URLを叩き、ログイン先のhtmlを表示 50res = session.post(url, data=info, cookies=cookie) 51res.raise_for_status() #1 52 53 54# 受注管理ページへ遷移 55url = 56res = session.get("https://[対象ECサイトドメイン]/admin/order/") 57res.raise_for_status() #2 58 59 60# 受注データのDLリクエストURL 61url = "https:/[対象ECサイトドメイン]/admin/order/?" 62res = session.get(url) 63res.raise_for_status() #3 64 65 66# dataに項目をセット 67data = { 68 "txid:":authenticity, 69 "mode:":"csv", 70 "order_id:":"", 71 "search_page_max:":"500", 72 "search_supdateyear:":t_year, 73 "search_supdatemonth:":t_month, 74 "search_supdateday:":t_day, 75 "search_eupdateyear:":a_year, 76 "search_eupdatemonth:":a_month, 77 "search_eupdateday:":a_day 78 } 79 80header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/[ブラウザのユーザエージェント] (KHTML, like Gecko) Chrome/[ブラウザのユーザエージェント] Safari/[ブラウザのユーザエージェント]"} 81 82res = session.post(url, headers=header, data=data) 83res.raise_for_status() # 4 84 85# レスポンスで返ってきたコンテンツをcsvとして保存 86save_file_name = t_year + t_month + t_day + "-" + a_year + a_month + a_day +".csv" 87save_file_path = r"\[ローカルフォルダパス]\Python\EcOrder" 88save_file_path_join = os.path.join(save_file_path, save_file_name) 89 90with open(save_file_path_join, 'wb') as save_file: 91 save_file.write(res.content) 92

試したこと

res = session.post(url, headers=header, data=data) res.raise_for_status() # 4

の.post()を.get()に置き換えた場合は500エラーにならず、htmlが返ってきます(csvに保存されます)。

res = session.get(url, data=data) res.raise_for_status() # 4

が、.post()にすると500エラーとなってしまい・・・。

初歩的な質問でしたら申し訳ございません、類似の質問・回答が見つからず、新たに質問をさせていただきました。
対応方法をご教示いただけませんでしょうかm()m

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

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

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

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

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

guest

回答1

0

自社ECサイト(eccube)の受注データのcsvダウンロードを自動化したい

.

The server has encountered a situation it does not know how to handle.
サーバーが処理方法を知らない状況に遭遇しました。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500

ですので、サーバー側のログなどを参照するのが良い気がしました。

dataで送信している内容がサーバーの想定するものではないのかな?という気がします。
(それで500のステータスが返ってくるのはサーバー側の動きとして適切ではないのかもしれませんが・・)

Python自体のコードの問題ではないところだと思いますので、
まず最初にVSCodeの拡張機能のREST Clientなど(似たようなツール)を使って
リクエストが正しいことを確認してみると良いかもしれません。
https://marketplace.visualstudio.com/items?itemName=humao.rest-client


GETでbody(data)を送信するべきではないようです。
参考までです。

注意: GET リクエストで body や payload を送信すると、既存の実装の中にはリクエストを拒否するものがあるかもしれません - 仕様では禁止されていませんが、そのセマンティクスは未定義です。GETリクエストでペイロードを送信することだけは避けた方がよい。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET

投稿2022/01/06 08:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

JPYJPY

2022/01/07 02:14

ご回答いただきありがとうございます! ECサイトの管理者に確認してみようと思います。 諸々確認取れ次第、顛末をこちらでご報告させていただきます。 (参考情報等もありがとうございます!)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問