如何防止 Python 的 urllib(2) 遵循重定向
- 2025-03-21 09:07:00
- admin 原创
- 37
问题描述:
我目前正在尝试使用 Python 登录一个网站,但该网站似乎在同一页面上发送 cookie 和重定向语句。Python 似乎遵循该重定向,从而阻止我读取登录页面发送的 cookie。如何防止 Python 的 urllib(或 urllib2)urlopen 遵循重定向?
解决方案 1:
你可以做几件事:
构建自己的 HTTPRedirectHandler 来拦截每个重定向
创建 HTTPCookieProcessor 的一个实例并安装该开启器,以便您可以访问 cookiejar。
这是一个快速的小事,它显示了
import urllib2
#redirect_handler = urllib2.HTTPRedirectHandler()
class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_302(self, req, fp, code, msg, headers):
print "Cookie Manip Right Here"
return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)
http_error_301 = http_error_303 = http_error_307 = http_error_302
cookieprocessor = urllib2.HTTPCookieProcessor()
opener = urllib2.build_opener(MyHTTPRedirectHandler, cookieprocessor)
urllib2.install_opener(opener)
response =urllib2.urlopen("WHEREEVER")
print response.read()
print cookieprocessor.cookiejar
解决方案 2:
如果您只需要停止重定向,那么有一个简单的方法可以做到。例如,我只想获取 cookie,并且为了获得更好的性能,我不希望重定向到任何其他页面。我还希望代码保持为 3xx。让我们以 302 为例。
class MyHTTPErrorProcessor(urllib2.HTTPErrorProcessor):
def http_response(self, request, response):
code, msg, hdrs = response.code, response.msg, response.info()
# only add this line to stop 302 redirection.
if code == 302: return response
if not (200 <= code < 300):
response = self.parent.error(
'http', request, response, code, msg, hdrs)
return response
https_response = http_response
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), MyHTTPErrorProcessor)
这样,您甚至不需要进入 urllib2.HTTPRedirectHandler.http_error_302()
但更常见的情况是,我们只是想停止重定向(按要求):
class NoRedirection(urllib2.HTTPErrorProcessor):
def http_response(self, request, response):
return response
https_response = http_response
通常这样使用:
cj = cookielib.CookieJar()
opener = urllib2.build_opener(NoRedirection, urllib2.HTTPCookieProcessor(cj))
data = {}
response = opener.open('http://www.example.com', urllib.urlencode(data))
if response.code == 302:
redirection_target = response.headers['Location']
解决方案 3:
urllib2.urlopen
调用build_opener()
此处理程序类列表:
handlers = [ProxyHandler, UnknownHandler, HTTPHandler,
HTTPDefaultErrorHandler, HTTPRedirectHandler,
FTPHandler, FileHandler, HTTPErrorProcessor]
您可以尝试urllib2.build_opener(handlers)
使用省略的列表调用自己HTTPRedirectHandler
,然后调用open()
结果上的方法来打开您的 URL。如果您真的不喜欢重定向,您甚至可以调用urllib2.install_opener(opener)
您自己的非重定向打开器。
听起来你真正的问题是urllib2
没有按照你想要的方式处理 cookies。另请参阅如何使用 Python 登录网页并检索 cookies 以供日后使用?
解决方案 4:
这个问题以前在这里被问过。
编辑:如果您必须处理古怪的 Web 应用程序,您可能应该尝试mechanize。这是一个模拟 Web 浏览器的出色库。您可以控制重定向、cookie、页面刷新……如果网站不严重依赖 JavaScript,那么 mechanize 会让您感觉非常好。
扫码咨询,免费领取项目管理大礼包!