在Python中,为什么urllib.urlopen会让Google给出http状态;302移动了;?

在Python中,为什么urllib.urlopen会让Google给出http状态;302移动了;?,python,urllib,http-status-code-302,Python,Urllib,Http Status Code 302,在CentOS 6.4上使用Python 2.6.6 import urllib #url = 'http://www.google.com.hk' #ok #url = 'http://clients1.google.com.hk' #ok #url = 'http://clients1.google.com.hk/complete/search' #ok (blank) url = 'http://clients1.google.com.hk/complete/search?

在CentOS 6.4上使用Python 2.6.6

import urllib
#url = 'http://www.google.com.hk'    #ok
#url = 'http://clients1.google.com.hk'    #ok
#url = 'http://clients1.google.com.hk/complete/search'  #ok (blank)
url  = 'http://clients1.google.com.hk/complete/search?output=toolbar&hl=zh-CN&q=abc'  #fails
print url
page = urllib.urlopen(url).read()
print page
使用前3个URL,代码可以正常工作。但对于第4个URL,Python给出了以下302:

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://clients1.google.com.hk/complete/search?output=toolbar&amp;hl=zh-CN&amp;q=abc">here</A>.
</BODY></HTML>
谷歌说URL被移动了,但URL是一样的。你知道为什么吗


更新:URL在浏览器中都可以正常工作。但是在Python命令行中,第四个URL给出了一个302。

它很可能与头和cookie有关。我使用curl在命令行上做了一个快速测试。它也给了我302移动。它提供的
位置
标题与文档中的标题不同。如果我遵循主体URL,我会得到一个204响应(奇怪)。如果我遵循位置标题,我最终会得到一个循环响应,如您所示


也许重要的是设置Cookie头。它可能正在重定向,直到获得适当的cookie集。它还可能扫描用户代理并基于此执行某些操作。这些是浏览器区别于请求或urlib等工具的重要方面。浏览器创建会话、存储cookie并发送不同的头。

我不知道为什么urllib会失败(我得到了相同的响应),但是lib工作得很好:

import requests
url = 'http://clients1.google.com.hk/complete/search?output=toolbar&hl=zh-CN&q=abc'    # fails
print (requests.get(url).text)

如果您使用您最喜欢的web调试器(Fiddler for me)并在浏览器中打开该URL,您将看到也会得到最初的302响应。您的浏览器足够智能,可以自动重定向。因此,您的代码返回了正确的响应。如果您希望代码自动重定向到新URL,那么您必须使代码足够智能才能这样做。

urllib
忽略cookies并在没有cookies的情况下发送新请求,因此它会在该URL处导致重定向循环。要处理此问题,您可以使用
urllib2
(这是最新的)并添加cookie处理程序:

import urllib2
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
response = opener.open('http://clients1.google.com.hk/complete/search?output=toolbar&hl=zh-CN&q=abc')
print response.read()

在浏览器或Python命令行中,URL给我一个“200OK”值?我从Python 2中得到了302。7@davidjhp,是的,在浏览器中。这不是很奇怪吗。必须与标题有关,而不是用户代理(我试图模仿),我猜它可能与cookie有关。是的,但是指定的重定向url将导致无限循环。
import urllib2
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
response = opener.open('http://clients1.google.com.hk/complete/search?output=toolbar&hl=zh-CN&q=abc')
print response.read()