使用requests模块如何检测网站重定向到另一个页面?

19
例如,如果我访问www.yahoo.com/thispage,并且雅虎设置了一个过滤器来将/thispage重定向到/thatpage。因此,每当有人访问/thispage时,他们会跳转到/thatpage
如果我使用httplib/requests/urllib,它会知道是否发生了重定向?会遇到什么错误页面?
一些网站会在页面不存在时将用户重定向到/errorpage

2
你正在尝试解决什么问题?你的代码出了什么问题?如果你只是想了解错误模式,请自己测试这种行为。 - Marcin
2
请查看 https://dev59.com/yXRB5IYBdhLWcg3wro2B。 - OneOfOne
1
@Marcin 我有一个巨大的URL列表(1k +)需要测试它们是否可用。我随机选择了40-50个进行手动测试,发现有些当页面无法找到时会被重定向到错误页面。另外,我还发现许多URL也被重定向了,因为URL模式已更改,相同的名称只是以不同的方式编写。 - iCodeLikeImDrunk
2
@OneOfOne 看起来有点像我需要的,我会去看看。谢谢! - iCodeLikeImDrunk
4个回答

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

19
为了防止请求跟随重定向,请使用:

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

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

3

被接受的答案是正确的第一选项,但在某些情况下,如果网站通过meta标签重定向,则它们在重定向后还指定了一个规范链接。在这个例子中,让我试着从维基百科请求http://en.wikipedia.org/wiki/Google_Inc_Class_A,这是一个重定向的网址。

>> 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与您匹配。因此,明确地说,这是一个不太美观的第二选择,但如果其他方法都失败了,值得一试。

对于未来的读者:我刚刚检查了这个例子,历史记录已经正确地填充了:requests.get('http://en.wikipedia.org/wiki/Google_Inc_Class_A', allow_redirects=True)。我不知道是由于“allow_redirects”参数还是由于新版本的requests包。 - Alberto Coletta

2

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

如果他们采用前者,requests将透明地处理它。请注意,任何合理的错误页面重定向仍将具有错误状态码(例如404),您可以检查response.status_code


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接