我的意思是,如果我访问“www.yahoo.com/thispage”,而 yahoo 已经设置了一个过滤器来将 /thispage 重定向到 /thatpage。因此,无论何时有人访问/thispage,他/她都会登陆/thatpage。
如果我使用 httplib/requests/urllib,它会知道有重定向吗?什么错误页面?某些站点在找不到页面时将用户重定向到 /errorpage。
我的意思是,如果我访问“www.yahoo.com/thispage”,而 yahoo 已经设置了一个过滤器来将 /thispage 重定向到 /thatpage。因此,无论何时有人访问/thispage,他/她都会登陆/thatpage。
如果我使用 httplib/requests/urllib,它会知道有重定向吗?什么错误页面?某些站点在找不到页面时将用户重定向到 /errorpage。
使用,您可以在响应对象requests
的属性中获得所有重定向的列表。.history
它返回一个 Python 列表。有关更多信息,请参阅文档。
要防止请求跟随重定向,请使用:
r = requests.get('http://www.yahoo.com/thispage', allow_redirects=False)
如果它确实在重定向中,您可以在 r.headers['location'] 中检查重定向目标位置。
接受的答案是正确的第一个选项,但在某些情况下,如果网站使用元标记重定向,他们还会在重定向后指定规范链接。在此示例中,让我尝试从 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 匹配。所以要清楚,这是一个丑陋的第二个选择,但如果一切都失败了,值得尝试。
这取决于他们如何进行重定向。“正确”的方式是返回一个重定向的 HTTP 状态码(301/302/303)。“错误”的方法是在 HTML 中放置一个刷新元标记。
如果他们做前者,requests
将透明地处理它。请注意,任何正常的错误页面重定向仍然会有错误状态代码(例如 404),您可以将其检查为response.status_code
.