18

我的意思是,如果我访问“www.yahoo.com/thispage”,而 yahoo 已经设置了一个过滤器来将 /thispage 重定向到 /thatpage。因此,无论何时有人访问/thispage,他/她都会登陆/thatpage。

如果我使用 httplib/requests/urllib,它会知道有重定向吗?什么错误页面?某些站点在找不到页面时将用户重定向到 /errorpage。

4

4 回答 4

28

使用,您可以在响应对象requests的属性中获得所有重定向的列表。.history它返回一个 Python 列表。有关更多信息,请参阅文档

于 2012-11-20T22:03:39.620 回答
16

要防止请求跟随重定向,请使用:

r = requests.get('http://www.yahoo.com/thispage', allow_redirects=False)

如果它确实在重定向中,您可以在 r.headers['location'] 中检查重定向目标位置。

于 2012-11-20T22:06:57.460 回答
3

接受的答案是正确的第一个选项,但在某些情况下,如果网站使用元标记重定向,他们还会在重定向后指定规范链接。在此示例中,让我尝试从 wikipedia 请求http://en.wikipedia.org/wiki/Google_Inc_Class_A,这是一个重定向的 url。

>> request = requests.get('http://en.wikipedia.org/wiki/Google_Inc_Class_A')

我检查并:

>> request.history
[]

另一种方法是尝试提取规范的 url,希望它包含您被重定向到的内容。(注意我在这里也使用 BeautifulSoup)

>> soup = BeautifulSoup(request._content)
>> canonical = soup.find('link', {'rel': 'canonical'})
>> canonical['href']
'http://en.wikipedia.org/wiki/Google'

在这种特殊情况下,它与您重定向到的 url 匹配。所以要清楚,这是一个丑陋的第二个选择,但如果一切都失败了,值得尝试。

于 2014-11-25T04:44:27.910 回答
1

这取决于他们如何进行重定向。“正确”的方式是返回一个重定向的 HTTP 状态码(301/302/303)。“错误”的方法是在 HTML 中放置一个刷新元标记。

如果他们做前者,requests将透明地处理它。请注意,任何正常的错误页面重定向仍然会有错误状态代码(例如 404),您可以将其检查为response.status_code.

于 2012-11-20T22:05:51.240 回答