“如何下载返回的文件”;间接地;(??)从html表单提交?(python、urllib、urllib2等)

“如何下载返回的文件”;间接地;(??)从html表单提交?(python、urllib、urllib2等),python,forms,download,urllib2,urllib,Python,Forms,Download,Urllib2,Urllib,编辑:解决问题。最终结果是url中的“http:”而不是“https:”(我犯了一个愚蠢的错误)。但正是来自cetver的干净代码示例帮助我解决了这个问题。感谢所有提出建议的人 将此url放入firefox会触发相应的下载和另存为对话框: https://www.virwox.com/orders.php?download_open=Download&format_open=.xls 上面的链接与在页面上通过表单的“下载”按钮提交表单相同 以下是生成上述url的表单的相关html: &

编辑:解决问题。最终结果是url中的“http:”而不是“https:”(我犯了一个愚蠢的错误)。但正是来自cetver的干净代码示例帮助我解决了这个问题。感谢所有提出建议的人

将此url放入firefox会触发相应的下载和另存为对话框:

https://www.virwox.com/orders.php?download_open=Download&format_open=.xls
上面的链接与在页面上通过表单的“下载”按钮提交表单相同

以下是生成上述url的表单的相关html:

<form action='orders.php' method='get'><fieldset><legend>Open Orders (2):</legend>
  <input type='submit' value='Download' name='download_open' /> 
  <select name='format_open'>
    <option value='.xls'>.xls</option>
    <option value='.csv'>.csv</option>
    <option value='.xml'>.xml</option></select>
</form>
…openOrders_xml最终只是原始页面(https://www.virwox.com/orders.php)

firefox如何知道还有一个文件要下载,我如何在Python中检测并下载这个文件

请注意,这不是一个安全/登录问题,因为如果我遇到身份验证问题,我甚至无法获得orders.php页面

编辑:我想知道这是否与重定向有关(我使用的是基本重定向处理程序),或者我应该使用liek urllib.fileretrieve()

编辑:这是完整程序的代码,以防万一是相关的

import urllib
import urllib2
import cookielib
import pprint

from urllib import urlencode

username=###############
password=###############

virwoxTopLevel_url = "http://www.virwox.com/"

overview_url = "https://www.virwox.com/index.php"


# Header
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }

# Handlers...
# cookie handler...
cookie_handler= urllib2.HTTPCookieProcessor( cookielib.CookieJar() )
# redirect handler...
redirect_handler= urllib2.HTTPRedirectHandler()

# create "opener" (OpenerDirector instance)
virwox_opener = urllib2.build_opener(redirect_handler,cookie_handler)

# login
login_url = "https://www.virwox.com/index.php"
values = { 'uname' : username, 'password' : password }
login_data = urllib.urlencode(values)
login_request = urllib2.Request(login_url,login_data,headers)
login_response = virwox_opener.open(login_request)

overview_html = login_response.read();

virwox_json_url = "http://api.virwox.com/api/json.php"
getTest = urllib.urlencode( { "method":"getMarketDepth", "symbols[0]":"EUR/SLL","symbols[1]":"USD/SLL","buyDepth":1,"sellDepth":1,"id":1 } )
get_response = urllib2.urlopen(virwox_json_url,getTest)
#print get_response.read()

# get orders list
openOrders_url = virwoxTopLevel_url+"/orders.php"
openOrders_params = urlencode( { "download_open":"Download", "format_open":".xml" } )
openOrders_request = urllib2.Request(openOrders_url,openOrders_params,headers)
openOrders_response = virwox_opener.open(openOrders_request)
openOrders_xml = openOrders_response.read()

# the following prints the html of the /orders.php page not the desired download data:
print "******************************************"
print(openOrders_xml)

print "******************************************"
print openOrders_response.info()
print openOrders_response.geturl()
print "******************************************"
# the following prints nothing, i assume because without the cookie handler, fails to authenticate
#  (note that authentication is by the php program, not html authentication, so no "authentication hangler" above
print urllib2.urlopen("https://www.virwox.com/orders.php?download_open=Download&format_open=.xml").read()

以下代码未经测试

比如:

import urllib, urllib2,

HOST = 'https://www.virwox.com'
FORMS = {
    'login': {
        'action': HOST + '/index.php',
        'data': urllib.urlencode( {
            'uname':'username', 
            'password':'******'
        } )
    },
    'orders': {
        'action': HOST + '/orders.php',
        'data': urllib.urlencode( {
            'download_open':'Download', 
            'format_open':'.xml'
        } )
    }
}

opener = urllib2.build_opener( urllib2.HTTPCookieProcessor() )
try:
    req = urllib2.Request( url = FORMS['login']['action'], data = FORMS['login']['data'] )
    opener.open( req ) #save login cookie
    print 'Login: OK'
except Exception, e:
    print 'Login: Fail'
    print e   
try:
    req = urllib2.Request( url = FORMS['orders']['action'], data = FORMS['orders']['data'] )
    print 'Orders Page: OK'
except Exception, e:
    print 'Orders Page: Fail'
    print e
try:
    xml = opener.open( req ).read()
    print xml
except Exception, e:
    print 'Obtain XML: Fail'
    print e

您可能需要这样一个
urllib2.HTTPPasswordMgr
(未经测试,因为我没有您的uname/pw):

然后,您可以:

print source

查看它是否包含您所需的xml数据。

看起来您的问题已经得到了回答,但您可能想看看这个包。它基本上是标准lib工具的一个很好的包装器。下面(可能)就是你想要的

import requests

r = requests.get('http://www.virwox.com/orders.php', 
    allow_redirects=True,
    auth=('user', 'pass'), 
    data={'download_open': 'Download', 'format_open': '.xls'})

print r.content

您是否检查了firefox在其请求中发送的内容?需要浏览器用户代理吗?他们的其他隐藏领域/价值观吗?我很确定我发送的正是firefox发送的内容。下面是当我点击“下载”按钮时“Live HTTP Header”显示的内容:哦,这里是:
GET/orders.php?download\u open=download&format\u open=.xls&format\u history=.xls
,正如我所说,我可以将所示的url准确地放入firefox的地址栏中。(也不是说额外的参数“format_historic”不相关,可以省略,也可以不省略,没有区别)(https://www.virwox.com/orders.php?download_open=Download&format_open=.xls).read()获取所需数据?谢谢。我试试看。但是,除了你更干净的编码风格之外,我不确定,乍一看,你在语义上做了什么不同的事情。看起来您构建了相同的开启器、请求和使用相同的方法。嘿,成功了!六羟甲基三聚氰胺六甲醚。。。但是为什么呢?仔细看,我发现您在开场白中遗漏了重定向处理程序。是这样吗?我的重定向处理程序是否捕获了将其发送回原始页面的内容,而忽略了两者之间的数据(可以这么说)?相同的语言、相同的libs在语义上没有区别。然后我写了这段代码,您的列表不存在或者我没有注意到它
build_opener
have
default_class=[ProxyHandler,UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler,HTTPRedirectHandler,FTPHandler,FileHandler,HTTPErrorProcessor]
正如您所看到的
HTTPRedirectHandler
是它们的一种,因此,不需要手动调用它。好吧,在这里,编写漂亮干净的代码才是真正的答案。在仔细比较了您的代码和我的代码之后,我终于注意到我在url中插入了一个http:,而不是https:,这就是问题的原因。
print source
import requests

r = requests.get('http://www.virwox.com/orders.php', 
    allow_redirects=True,
    auth=('user', 'pass'), 
    data={'download_open': 'Download', 'format_open': '.xls'})

print r.content