如何使用python请求库或其他方式找到重定向的URL

时间:2015-01-25 11:28:19

标签: python

此网址:

http://www.yellowpages.com.sg/newiyp/UrlRedirect?applicationInd=yp&searchType=68&searchCriteria=multiple+choices&accessType=8&advertiserName=Multiple+Choices&url=62CE8F02A1BE04A51C81F85D1CE8B54DFC608A9CDA925C15EED5DA6DD90E3F7DC99CFF77216D1D1083877BA841EB97C3

重定向到: http://www.callmyname.sg/view/Multiple+Choices/Uk9JRC9TRzA0SkstQkJDNkRFNTEuMTNCNS9FRDY5LUE4NzgtRUY=

使用请求时我得到:

import requests
url = "http://www.yellowpages.com.sg/newiyp/UrlRedirect?applicationInd=yp&searchType=68&searchCriteria=multiple+choices&accessType=8&advertiserName=Multiple+Choices&url=62CE8F02A1BE04A51C81F85D1CE8B54DFC608A9CDA925C15EED5DA6DD90E3F7DC99CFF77216D1D1083877BA841EB97C3"
headers = {'User-Agent':'user_agent',}
r = requests.get(url,headers=headers)
r.url

它返回相同的第一个网址,而不是重定向的网址

4 个答案:

答案 0 :(得分:2)

以下是样本。我使用了bit.ly,因为我使用你的网址获得了403。

>>> url = "http://bit.ly/18SuUzJ"
>>> r = requests.get(url, allow_redirects=False)
>>> r.status_code
301
>>> r.headers['Location']
'http://stackoverflow.com/'

答案 1 :(得分:1)

根据请求文档,您需要r.history

答案 2 :(得分:0)

此网站似乎需要会话cookie才能使重定向生效。

r.url实际上会在重定向(unless you have changed the configuration)后显示网址。

您的重定向问题是,如果Cookie尚未存在,则永远不会发生。您可以通过隐身/私密模式下的浏览器访问该网址进行测试。您将看到http://www.yellowpages.com.sg/的错误消息,状态代码为200.重新加载后,您将被重定向。

奇怪的是,即使使用requests会话,我也无法获得重定向。使用真实浏览器的用户代理字符串似乎也没有帮助。您可能需要详细比较这两个请求,以找出关键区别。

我试过的代码看起来像这样:

import requests
headers = {'User-Agent': 'user_agent',}
s = requests.Session()
url = "http://www.yellowpages.com.sg/"
r = s.get(url, headers=headers)
url = "http://www.yellowpages.com.sg/newiyp/UrlRedirect?applicationInd=yp&searchType=68&searchCriteria=multiple+choices&accessType=8&advertiserName=Multiple+Choices&url=62CE8F02A1BE04A51C81F85D1CE8B54DFC608A9CDA925C15EED5DA6DD90E3F7DC99CFF77216D1D1083877BA841EB97C3"
r = s.get(url, headers=headers)
r.url

答案 3 :(得分:0)

HEAD 请求可能比 GET 请求更快。即使不遵循 GET 重定向也是如此。这是因为 HEAD 仅返回标题,而不返回内容,而 GET 返回两者。

import requests

>>> response = requests.head('https://bit' + '.ly/pyre', allow_redirects=False)

>>> response.is_redirect
True

>>> response.headers['Location']
'http://www.python.org/doc/current/library/re.html'

上述方法应该准确地识别一级重定向。同样为简单起见,我使用 requests.head 而不是 requests.Session().head