2016-06-19 41 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)