2016-04-21 53 views
1

我正在尋找能夠自動從Bureau of Transportation Statistics Carrier Website下載.zip文件的腳本,但我無法獲得相同的響應標頭,因爲我可以在Chrome中看到我下載了zip文件。我期待得到一個響應頭,看起來像這樣:Python請求不返回與瀏覽器請求相同的標頭/ cURL

HTTP/1.1 302 Object moved 
Cache-Control: private 
Content-Length: 183 
Content-Type: text/html 
Location: http://tsdata.bts.gov/103627300_T_T100_SEGMENT_ALL_CARRIER.zip 
Server: Microsoft-IIS/8.5 
X-Powered-By: ASP.NET 
Date: Thu, 21 Apr 2016 15:56:31 GMT 

然而,我可以在Chrome網絡檢查員看到我正在以下響應相同的信息調用requests.post(url, data=params, headers=headers)時:

>>> res.headers 
{'Cache-Control': 'private', 'Content-Length': '262', 'Content-Type': 'text/html', 'X-Powered-By': 'ASP.NET', 'Date': 'Thu, 21 Apr 2016 20:16:26 GMT', 'Server': 'Microsoft-IIS/8.5'} 

它幾乎所有東西除了它缺少Location密鑰,我需要爲了下載.zip文件與我想要的所有數據。 Content-Length價值是不同的,但我不知道如果這是一個問題。

我認爲我的問題與事實有關,當您點擊頁面上的「下載」時,它實際上會發送兩個我可以在Chrome網絡控制檯中看到的請求。第一個請求是一個POST請求,產生一個HTTP響應302,然後在響應頭中有Location。第二個請求是對響應頭的Location值中指定的url的GET請求。

我真的應該在這裏發送兩個請求嗎?爲什麼我沒有像在瀏覽器中那樣使用requests獲得相同的響應頭? FWIW我用curl -X POST -d /*my data*/和回來這在我的終端:

<head><title>Object moved</title></head> 
<body><h1>Object Moved</h1>This object may be found <a HREF="http://tsdata.bts.gov/103714760_T_T100_SEGMENT_ALL_CARRIER.zip">here</a>.</body> 

非常感謝所有幫助!

+0

我能夠通過使用'subprocess' Python模塊獲取數據。如果有一種方法可以通過'requests'完成,我仍然很感興趣。 –

回答

1

我能夠通過使用差不多我可以在Google Chrome Web控制檯中看到的所有標題下載我一直在尋找的zip文件。我的標題是這樣的:

{'Connection': 'keep-alive', 'Cache-Control': 'max-age=0', 'Referer': 'http://www.transtats.bts.gov/DL_SelectFields.asp?Table_ID=293', 'Origin': 'http://www.transtats.bts.gov', 'Upgrade-Insecure-Requests': 1, 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36', 'Cookie': 'ASPSESSIONIDQADBBRTA=CMKGLHMDDJIECMNGLMDPOKHC', 'Accept-Language': 'en-US,en;q=0.8', 'Accept-Encoding': 'gzip, deflate', 'Content-Type': 'application/x-www-form-urlencoded'} 

然後,我只寫了:

res = requests.post(url, data=form_data, headers=headers) 

其中form_data從Chrome的控制檯的「表單數據」部分複製。一旦我收到請求,我使用zipfileio模塊來分析存儲在res中的響應內容。像這樣:

import zipfile, io 
zipfile.ZipFile(io.BytesIO(res.content)) 

然後該文件位於我運行Python代碼的目錄中。

感謝用戶回答this thread