私のFirefoxブラウザでは、ダウンロードサイトにログインし、そのクエリーボタンの1つをクリックします。小さなウィンドウが開き、「report1.csvを開く」という名前が付けられ、「開く」または「ファイルを保存」を選択できます。私はファイルを保存します。このアクションLive HTTP headersのために「Content-Disposition:attachment;」というWebページを取得できません。 python-requestsを使用して
は私を示しています
ます。https:// MYSERVER/ReportPage & NAMEをダウンロード= ALL & DATE = THISYEAR
GET/ReportPage = = ALL & DATEを& NAMEをダウンロードTHISYEAR HTTP/1.1
ホスト:myserverの
のUser-Agent:Mozillaの/ 5.0(X11; Linuxのx86_64で、RV:52.0)のGecko/20100101 Firefoxの/ 52.0
de-DE; q = 0.9、/; q = 0.8
Accept-Language:en-US、en; q = 0.8、de-DE; q = 0.5、デ; Q = 0.3
エンコーディングを受け入れ:、GZIPを収縮、
リファラーBRます。https:// MYSERVER/ReportPage 4 & NAME = ALL & DATE = THISYEAR
クッキー:JSESSIONID = 88DEDBC6880571FDB0E6E4112D71B7D6
接続?キープアライブ
アップグレード不安 - リクエスト:1HTTP/1.1 200 OK
日付:土、2017年12月30日夜10時37分40秒GMT
サーバー:Apacheの-コヨーテ/ 1.1
最終-更新:土、2017年12月30日夜10時37分40秒GMT
が有効期限:木、1970年1月1日00 :00:00 GMT
プラグマ:no-cache
キャッシュコントロール:no-cache、no-store
コンテンツの処理:添付ファイル。 filename = "report1.csv";ファイル名* = UTF-8''report1.csv
のContent-Type:テキスト/ CSV
のContent-Length:332369
は、キープアライブ:= 5タイムアウト、最大= 100
接続:キープアライブ
これでリクエストをエミュレートしようとしています。
$ python3
>>> import requests
>>> from lxml import html
>>>
>>> s = requests.Session()
>>> s.verify = './myserver.crt' # certificate of myserver for https
>>>
>>> # get the login web page to enter username and password
... r = s.get('https://myserver')
>>>
>>> # Get url for logging in. It's the action-attribute in the form anywhere.
... # We use xpath.
... tree = html.fromstring(r.text)
>>> loginUrl = 'https://myserver/' + list(tree.xpath("//form[@id='id4']/@action"))[0]
>>> print(loginUrl) # it contains a session-id
https://myserver/./;jsessionid=77EA70CB95252426439097E274286966?0-1.loginForm
>>>
>>> # logging in with username and password
... r = s.post(loginUrl, data = {'username':'ingo','password':'mypassword'})
>>> print(r.status_code)
200
>>> # try to get the download file using url from Live HTTP headers
... downloadQueryUrl = 'https://myserver/ReportPage?download&NAME=ALL&DATE=THISYEAR'
>>> r = s.get(downloadQueryUrl)
>>> print(r.status_code)
200
>>> print(r. headers)
{'Connection': 'Keep-Alive',
'Date': 'Sun, 31 Dec 2017 14:46:03 GMT',
'Cache-Control': 'no-cache, no-store',
'Keep-Alive': 'timeout=5, max=94',
'Transfer-Encoding': 'chunked',
'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT',
'Pragma': 'no-cache',
'Content-Encoding': 'gzip',
'Content-Type': 'text/html;charset=UTF-8',
'Server': 'Apache-Coyote/1.1',
'Vary': 'Accept-Encoding'}
>>> print(r.url)
https://myserver/ReportPage?4&NAME=ALL&DATE=THISYEAR
>>>
リクエストは成功しましたが、ファイルのダウンロードページが表示されません。 「Content-Disposition:attachment;」はありません。ヘッダーのエントリ。クエリの開始ページのみを取得します(例:リファラーからのページ
これはセッションクッキーと関連がありますか?リクエストが自動的にこれを管理しているようです。 csv-filesの特別な処理はありますか?ストリームを使用する必要がありますか? Live-HTTPヘッダーに表示されるダウンロードURLは正しいですか?たぶんダイナミックな創造がありますか?
「Content-Disposition:attachment;」というWebページを取得するにはどうすればよいですか? myserverからリクエストしてそのファイルをダウンロードしますか?
多分あなたはいくつかのヘッダーを追加する必要はありません。 "User-Agent" – furas
あなたは 'r.text'をチェックしましたか?たぶん有益な情報があるかもしれません。それは警告メッセージです。それをファイルに書き込んで、このファイルをブラウザで開くことができます。 – furas
@furasこれを指摘してくれてありがとう。私はこれを試してみる。 – Ingo