2016-06-19 68 views
2

我使用twill在受登錄表單保護的網站上導航。Python斜紋:通過PHP腳本下載的文件

from twill.commands import * 

go('http://www.example.com/login/index.php') 
fv("login_form", "identifiant", "login") 
fv("login_form", "password", "pass") 
formaction("login_form", "http://www.example.com/login/control.php") 
submit() 
go('http://www.example.com/accueil/index.php') 

在這最後一頁我想下載一個Excel文件,該文件是通過具有以下屬性的div訪問:

onclick="OpenWindowFull('../util/exports/control.php?action=export','export',200,100);" 

隨着twill我能夠訪問PHP腳本的URL,顯示文件的內容。

go('http://www.example.com/util/exports/control.php?action=export') 
show() 

但是,返回的字符串對應於原始內容:因此不可用。有沒有辦法以類似於urllib.urlretrieve()的方式直接檢索Excel文件?

+0

看起來類似於http://stackoverflow.com/questions/16283799/how-to-read- a-csv-file-from-a-url-python – dmitryro

+0

不完全是:在這種情況下,訪問網站受密碼保護。我需要發佈登錄表單。因此使用'斜紋'。 (我寧願使用'requests',但似乎有一個複雜的登錄標題控制,經過多次嘗試,我只能使用'twill')。 –

+0

編輯:我編輯我的問題:該文件是在MS Excel格式,而不是CSV,所以二進制數據... –

回答

1

我設法做到這一點發送cookie罐從twillrequests

注意:由於登錄時錯綜複雜的控制(無法找出正確的標題或其他選項),因此我無法使用requests

import requests 
from twill.commands import * 

# showing login form with twill 
go('http://www.example.com/login/index.php') 
showforms() 

# posting login form with twill 
fv("login_form", "identifiant", "login") 
fv("login_form", "password", "pass") 
formaction("login_form", "http://www.example.com/login/control.php") 
submit() 

# getting binary content with requests using twill cookie jar 
cookies = requests.utils.dict_from_cookiejar(get_browser()._session.cookies) 
url = 'http://www.example.com/util/exports/control.php?action=export' 

with open('out.xls', 'wb') as handle: 
    response = requests.get(url, stream=True, cookies=cookies) 

    if not response.ok: 
     raise Exception('Could not get file from ' + url) 

    for block in response.iter_content(1024): 
     handle.write(block)