【问题标题】:Find the redirected URL with Python requests library or otherwise [duplicate]使用 Python 请求库或其他方式查找重定向的 URL [重复]
【发布时间】:2015-01-25 11:28:18
【问题描述】:

这个网址:

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=

当使用requests时,我得到:

import requests

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

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

【问题讨论】:

标签: python python-requests


【解决方案1】:

这是一个示例。我使用了“bit.ly”,因为我使用您的 URL 得到了 403

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

【讨论】:

    【解决方案2】:

    根据请求文档,r.history 是您所需要的。

    【讨论】:

    • r.history 返回空列表
    • @muffinz 当我自己尝试时,我被 403 禁止。也许是不允许参观?还是我做错了?
    【解决方案3】:

    此站点似乎需要会话 cookie 才能进行重定向。

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

    重定向的问题是,如果 cookie 不存在,它就永远不会发生。您可以通过在隐身/私人模式下使用浏览器访问 URL 来测试它。您将看到来自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
    

    【讨论】:

      【解决方案4】:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多