约束:我没有使用python 3的选项,因此requests
是不可能的
我需要自动执行文件下载任务。
在Firefox中我可以看到此网址www.example.com/files/MyFile_2014-02-14.csv
上的文件请求在开发者控制台中是这样的:
14:38:33.782 POST www.example.com [HTTP/1.1 302 Found 406ms]
14:38:34.288 GET www.example.com/files/MyFile_2014-02-14.csv/ [HTTP/1.1 200 OK 687ms]
我使用以下代码自动执行该过程
import urllib
import urllib2
import cookielib
class SmartRedirectHandler(urllib2.HTTPRedirectHandler):
''' use it to prove if I get a 302 or not'''
def http_error_301(self, req, fp, code, msg, headers):
result = urllib2.HTTPRedirectHandler.http_error_301(self, req, fp, code, msg, headers)
result.status = code
return result
def http_error_302(self, req, fp, code, msg, headers):
result = urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)
result.status = code
return result
def main():
proxy_handler = urllib2.ProxyHandler({'http': 'http://myproxy.local'})
username='XXX'
password='YYY'
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, 'http://www.example.com', username, password)
pass_handler = urllib2.HTTPBasicAuthHandler(passman)
cookieJar = cookielib.CookieJar()
cookieprocessor = urllib2.HTTPCookieProcessor(cookieJar)
srh = SmartRedirectHandler()
opener =urllib2.build_opener(proxy_handler, pass_handler, cookieprocessor, srh)
urllib2.install_opener(opener)
data = urllib.urlencode({'username':username, 'password':password}) # To force post
fileurl = 'http://www.example.com/files/MyFile_2014-02-14.csv'
req = urllib2.Request(fileurl, data, headers={'Proxy-Connection':'keep-alive'})
c = urllib2.urlopen(req)
c.code
始终为200,而c.read()
仅在我们的欢迎页面上提供内容(仅在成功登录后才可用)
为什么我没有按预期获得302?
答案 0 :(得分:0)
这是一个简单的问题。
在你的代码中,像这样:
result = urllib2.HTTPRedirectHandler.http_error_301(self, req, fp, code, msg, headers)
result.status = code
当您获得结果表单urllib2.HTTPRedirectHandler.http_error_301
,result.code
和result.status
为200时,本地变量code
为301.
然后,您将status
设置为code
,即301
但是,result.code
仍然是200。
这就是全部,谢谢。