关于在Python中处理重定向

0 投票
1 回答
2762 浏览
提问于 2025-04-17 15:44

我刚开始学Python,想了解一些新的模块。幸运的是,也可以说不幸的是,我选择了urllib2模块,并开始用它处理一个让我头疼的URL。

首先,我创建了一个请求对象,然后在响应对象上调用了Read(),结果失败了。后来发现它实际上是被重定向了,但错误代码却还是200。我搞不清楚这是怎么回事。下面是我的代码 --

def get_url_data(url):
    print "Getting URL " + url
    user_agent = "Mozilla/5.0 (Windows NT 6.0; rv:14.0) Gecko/20100101 Firefox/14.0.1"
    headers = { 'User-Agent' : user_agent }
    request = urllib2.Request(url, str(headers) )

    try:    
        response = urllib2.urlopen(request)
    except urllib2.HTTPError, e:
        print response.geturl()
        print response.info()
        print response.getcode()
        return False;
    else:
        print response
        print response.info()
        print response.getcode()
        print response.geturl()
        return response

我用的这个函数是针对http://www.chilis.com的。

我本来期待能收到301、302或303的响应,但结果却是200。以下是我看到的响应 --

Getting URL http://www.chilis.com
<addinfourl at 4354349896 whose fp = <socket._fileobject object at 0x1037513d0>>
Cache-Control: private
Server: Microsoft-IIS/7.5
SPRequestGuid: 48bbff39-f8b1-46ee-a70c-bcad16725a4d
X-SharePointHealthScore: 0
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
MicrosoftSharePointTeamServices: 14.0.0.6120
X-MS-InvokeApp: 1; RequireReadOnly
Date: Wed, 13 Feb 2013 11:21:27 GMT
Connection: close
Content-Length: 0
Set-Cookie: BIGipServerpool_http_chilis.com=359791882.20480.0000; path=/

200
http://www.chilis.com/(X(1)S(q24tqizldxqlvy55rjk5va2j))/Pages/ChilisVariationRoot.aspx?AspxAutoDetectCookieSupport=1

有人能解释一下这个URL是什么,以及我该怎么处理吗?我知道可以参考Diveintopython.net上的“处理重定向”部分,但即使用那里的代码,我也还是看到了同样的200响应。

编辑:用DiveintoPython的代码后,我发现这是一个临时重定向。我不明白的是,为什么代码里的HTTP错误代码是200。难道这不是实际的返回代码吗?

编辑2:现在我看得更清楚了,这根本不是奇怪的重定向。我在修改标题。

编辑3:如果urllib2会自动跟随重定向,我不明白为什么下面的代码没有获取到chilis.com的首页。

docObj = get_url_data(url)
doc = docObj.read()
soup = BeautifulSoup(doc, 'lxml')
print(soup.prettify())

如果我使用浏览器最终重定向到的URL,就能正常工作(http://www.chilis.com/EN/Pages/home.aspx)。

1 个回答

2

urllib2 会自动跟随重定向,所以你看到的信息是来自被重定向到的页面。

如果你不想让它跟随重定向,你需要创建一个新的类来继承 urllib2.HTTPRedirectHandler。这里有一个相关的帖子,讲解了怎么做:如何阻止 Python 的 urllib(2) 跟随重定向

关于编辑3:看起来 www.chilis.com 需要接受 cookies。你可以用 urllib2 来实现这个,但我建议你安装 requests 模块(http://pypi.python.org/pypi/requests/)。

下面的代码似乎正好能满足你的需求(没有任何错误处理):

import requests

r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
print(soup.prettify())

撰写回答