2016-11-11 64 views
2

我想寫一個Python代碼下載,並從該URL保存文件的文件: http://obiee.banrep.gov.co/analytics/saw.dll?Download&Format=excel&Extension=.xls&BypassCache=true&lang=es&NQUser=publico&NQPassword=publico&Path=/shared/Consulta%20Series%20Estadisticas%20desde%20Excel/1.%20IPC%20base%202008/1.3.%20Por%20rango%20de%20fechas/1.3.2.%20Por%20grupo%20de%20gasto&ViewState=h09v965dvurdtkj0iuni7m1kbe&ContainerID=o%3ago%7er%3areport&RootViewID=go的Python:下載抵抗常用技術

預期的結果應該是下載並保存所服務的Excel文件。

該文件位於某種oracle數據庫的後面。該文件可以使用任何瀏覽器下載。 「Live HTTP headers」firefox extension告訴我這是一個GET請求。無論如何,我已經嘗試了通常的技術,我總是最終下載「saw.dll」,這是一個簡單的XML文件,而不是預期的Excel文件。

這裏是我的嘗試:

import urllib,urlib2,shutil 

url = 'http://obiee.banrep.gov.co/analytics/saw.dll?Download' 
values = { 
    'Format' : 'excel', 
    'Extension' : '.xls', 
    'BypassCache' : 'true', 
    'lang' : 'es', 
    'NQUser' : 'publico', 
    'NQPassword' : 'publico', 
    'Path' : '/shared/Consulta Series Estadisticas desde Excel/1. IPC base 2008/1.3. Por rango de fechas/1.3.2. Por grupo de gasto', 
    'ViewState' : 'h09v965dvurdtkj0iuni7m1kbe', 
    'ContainerID' : 'o%3ago%7er%3areport', 
    'RootViewID' : 'go', 
} 

data = urllib.urlencode(values) 
req = urllib2.Request(url,data) 
response = urllib2.urlopen(req) 
myfile = open('test.xls', 'wb') 
shutil.copyfileobj(response.fp, myfile) 
myfile.close() 

其他代碼我想:

import requests,shutil 

response = requests.get("http://obiee.banrep.gov.co/analytics/saw.dll?Download&Format=excel&Extension=.xls&BypassCache=true&lang=es&NQUser=publico&NQPassword=publico&Path=/shared/Consulta%20Series%20Estadisticas%20desde%20Excel/1.%20IPC%20base%202008/1.3.%20Por%20rango%20de%20fechas/1.3.2.%20Por%20grupo%20de%20gasto&ViewState=h09v965dvurdtkj0iuni7m1kbe&ContainerID=o%3ago%7er%3areport&RootViewID=go",stream=True) 

with open('test.xls', 'wb') as out_file: 
    shutil.copyfileobj(response.raw, out_file) 
del response 

我也嘗試過其他的東西,如使用wget,把要求和環保等等之間的一些延遲

任何想法?

謝謝,最好。

+0

.xls是一種XML格式...我不假設您已經嘗試在Excel中打開文件? –

+0

我做了,但預期的文件是「1.3.2。Por grupo de gasto.xls」,它是一個數據文件。打開saw.dll(這是我的代碼實際上下載的文件)在Excel中的作品,但它只是一個普通的XML文件,我不需要... – benzineengine

回答

2

您是否嘗試更改用戶代理?

... 
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'} 
requests.get(url=url, stream=True, headers=headers) 

也許服務器返回不同的響應給不同的用戶代理。

+0

其實我嘗試做類似的使用 'user_agent ='Mozilla 5.0 (Windows 7; Win64; x64) 'file_name =「test.xls」' 'u = urllib2.Request(url,headers = {'User-Agent':user_agent}) .. 但你的建議確實對我使用你建議的用戶代理工作! 非常感謝! – benzineengine

+0

是否改變了你的用戶代理工作?我試過了,沒有任何運氣。 – tdelaney

+0

這很有趣。 「Mozilla/5.0」是不夠的,但「'Mozilla/5.0(Macintosh; Intel Mac OS X 10_10_1)'」是。看起來你必須比我預期的更健談。 – tdelaney

0

此代碼實際工作對我來說:

import requests,shutil 

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'} 
response=requests.get(url='http://obiee.banrep.gov.co/analytics/saw.dll?Download&Format=excel&Extension=.xls&BypassCache=true&lang=es&NQUser=publico&NQPassword=publico&Path=/shared/Consulta%20Series%20Estadisticas%20desde%20Excel/1.%20IPC%20base%202008/1.3.%20Por%20rango%20de%20fechas/1.3.2.%20Por%20grupo%20de%20gasto&ViewState=h09v965dvurdtkj0iuni7m1kbe&ContainerID=o%3ago%7er%3areport&RootViewID=go', stream=True, headers=headers) 
with open('test.xls', 'wb') as out_file: 
    shutil.copyfileobj(response.raw, out_file) 
del response 

這是上述Jean Cassol建議的答覆。 非常感謝