Python запрашивает POST, возвращая неполный контент

Я пытаюсь загрузить файл csv, используя библиотеку запросов Python. Я использую библиотеку запросов, потому что сначала мне нужно пройти страницу отказа от ответственности, поэтому я использую объект сеанса для хранения всех файлов cookie и всего прочего. Мой запрос POST продолжает возвращаться с содержимым ответа, которое представляет собой только первые 6 строк файла csv. Когда я загружаю файл с помощью браузера, он имеет длину 1622 строки. Мой текущий скрипт:

import logging
logging.basicConfig(level=logging.DEBUG)
import pdb
import requests

s = requests.Session()

## Disclaimer page session
dis_url = 'http://a100.gov.bc.ca/pub/gwl/disclaimer.do'
accept_form = {'submitType':'Accept'}
s.post(dis_url, data=accept_form)


## POST request
base_url = 'http://a100.gov.bc.ca/pub/gwl/plot.do'
postContent = {
'fromYear':'2012',
'fromMonth':'1',
'fromDay':'1',
'toYear':'2013',
'toMonth':'1',
'toDay':'1',
'emsIDs':'E290172' ,
'mode':'GRAPH',
'mmaFlags':'false',    
'submitType':'Download'}


httpHeaders = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Host': 'a100.gov.bc.ca',
'Connection': 'keep-alive',
'Content-Length': '155',
'User-Agent': 'python-requests/1.2.3 CPython/2.7.3 Linux/3.5.0-23-generic',
'Content-Type': 'application/x-www-form-urlencoded',
'Referer': 'http://www.env.gov.bc.ca/wsd/data_searches/obswell/map/obsWells.html',
'Accept-Encoding': 'gzip,deflate,sdch',
'Accept-Language': 'en-US,en;q=0.8'}


r = s.post(base_url, data=postContent, headers=httpHeaders, stream=False, timeout=3600)
print r.content

Я также должен упомянуть, что я также пытался вернуть csv с помощью фрагментации следующим образом:

with open("report.csv",'wb') as file:
    r = s.post(base_url,stream=True,timeout=3600, data=postContent, headers=httpHeaders)
    for chunk in r.iter_content(chunk_size=1024):
        if chunk:
            file.write(chunk)
            file.flush()

Но я все еще получаю только первые 6 строк в report.csv.

Я думаю, что мой контент загружается не полностью, потому что я что-то упустил в заголовке моего запроса. Вот (рабочий) заголовок запроса браузера:

POST /pub/gwl/plot.do HTTP/1.1
Host: a100.gov.bc.ca
Connection: keep-alive
Content-Length: 155
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://www.env.gov.bc.ca
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://www.env.gov.bc.ca/wsd/data_searches/obswell/map/obsWells.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.    
Cookie: JSESSIONID=73de9312c8dcf1c4c657d19adbe811b88792479fe72eb2e2feeedea7d88bdbf8.e3uMah8KbhmLe3mMbN8Pa3uPbi1ynknvrkLOlQzNp65In0; WT_FPC=id=2fcd604924a9af3c13e1374599088181:lv=1383612362138:ss=1383612301792

И рабочий заголовок ответа браузера:

HTTP/1.1 200 OK
Date: Mon, 04 Nov 2013 20:59:52 GMT
Server: Oracle-Application-Server-10g/10.1.2.2.0 Oracle-HTTP-Server
Content-Disposition: attachment; filename="gwl_report.csv"
Cache-Control: must-revalidate
Content-Type: application/download
Set-Cookie: JSESSIONID=61d874e1b5ce07df96aaabe504d7c18788e5aaf773a7bee7ab4b0cf349a88aaa.e3uMah8KbhmLe3mMbN8Pa3uPbi1ynknvrkLOlQzNp65In0; path=/pub/gwl
Transfer-Encoding: chunked

Заголовки запроса из почтового запроса python (в моем ответе отсутствует Transfer-Encoding: chunked):

Content-Length : 126
Accept-Language : en-US,en;q=0.8
Accept-Encoding : gzip,deflate,sdch
Connection : keep-alive
Accept : text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent : python-requests/1.2.3 CPython/2.7.3 Linux/3.5.0-23-generic
Host : a100.gov.bc.ca
Referer : http://www.env.gov.bc.ca/wsd/data_searches/obswell/map/obsWells.html
Cookie : JSESSIONID=9a51e637cccc6164e4784631ef9a0ab21574c518c1c5c86cf0892bbf2aa22c95.e3uMah8KbhmLe3mMbN8Pa3uPbi1ynknvrkLOlQzNp65In0
Content-Type : application/x-www-form-urlencoded

Заголовок ответа Python (у меня отсутствует Transfer-Encoding: chunked):

content-length : 200
content-disposition : attachment; filename="gwl_report.csv"
set-cookie : JSESSIONID=9a51e637cccc6164e4784631ef9a0ab21574c518c1c5c86cf0892bbf2aa22c95.e3uMah8KbhmLe3mMbN8Pa3uPbi1ynknvrkLOlQzNp65In0; path=/pub/gwl
server : Oracle-Application-Server-10g/10.1.2.2.0 Oracle-HTTP-Server
cache-control : must-revalidate
date : Tue, 05 Nov 2013 00:51:47 GMT
content-type : application/download

Кто-нибудь знает, как я могу сделать запрос POST, который вернет весь файл csv?


person hailes    schedule 05.11.2013    source источник
comment
зачем тебе stream=False? что произойдет, если вы удалите это?   -  person Eevee    schedule 05.11.2013
comment
Если я удалю stream=False, я получу те же первые 6 строк в r.content   -  person hailes    schedule 05.11.2013
comment
что, если вы установите его на True? :) вы получаете Content-Length обратно с Python, но не из браузера, поэтому я предполагаю, что сайт глючит и не работает без фрагментации, но никто не заметил, потому что все браузеры это поддерживают.   -  person Eevee    schedule 05.11.2013
comment
@Eevee попробовал это, похоже, это не имеет значения, но, возможно, ОП повезет больше   -  person TankorSmash    schedule 05.11.2013
comment
@Eevee Можно ли сказать сайту, чтобы он разделил запрос?   -  person hailes    schedule 06.11.2013
comment
@Eevee Я также безуспешно пытался разбить ответ на части   -  person hailes    schedule 13.11.2013
comment
1. Действительно ли сервер отправляет только 200 байтов (я полагаю, это 6 строк) во втором ответе (Python)? 2. Вам нужно выяснить, почему он отправляет chunked в браузер, а не в Python; я предполагаю, что он просматривает User-Agent — попробуйте отправить тот же, что и браузер.   -  person Vasiliy Faronov    schedule 14.11.2013
comment
О, и как именно вы получаете заголовок ответа в случае с Python?   -  person Vasiliy Faronov    schedule 14.11.2013
comment
@vasiliy-faronov, что касается вашего второго вопроса, я получил заголовки ответов с помощью r.request.headers   -  person hailes    schedule 14.11.2013
comment
@vasiliy-faronov 1. Да, сервер отправляет только 200 байт во втором ответе (Python). 2. Я попытался установить тот же User-Agent, что и браузер, но ответ был таким же.   -  person hailes    schedule 14.11.2013


Ответы (1)


Возможно, это ошибка в запросах и urllib3 https://github.com/psf/requests/issues/4956
см. также: https://blog.petrzemek.net/2018/04/22/on-incomplete-http-reads-and-the-requests-library-in-python/

person guyskk    schedule 05.01.2021