如何获取请求“获取”以遵循所有重定向

时间:2018-05-01 03:38:20

标签: python python-3.x web-scraping python-requests

我正在编写一个脚本,以找出大量缩短的URL会导致哪些完整的URL。我正在使用请求模块来跟踪重定向并获取在浏览器中输入URL时最终会出现的URL。这适用于几乎所有的链接缩短程序,但由于我无法弄清楚的原因(例如对于disq.us URL我得到了相同的URL,而在我在浏览器中输入时,我得到了disq.us)重定向)

下面是一个片段,它可以正确解析缩短链接的链接,但是使用了disq.us-link失败了。我使用Python 3.6.4和请求模块的2.18.4版运行它。 因此,我不允许在问题中包含缩短的网址,因此我会将其留在评论中。

import requests

user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'

url1 = "SOME BITLY URL"
url2 = "SOME DISQ.US URL"

for url in [url1, url2]:
    s = requests.Session()
    s.headers['User-Agent'] = user_agent
    r = s.get(url, allow_redirects=True, timeout=10)
    print(r.url)

1 个答案:

答案 0 :(得分:1)

我的第一个网址是404。有趣的是,我只是尝试使用第二个URL并且它有效,但我使用了不同的用户代理。然后我尝试使用您的用户代理,但它没有重定向。

这表明网络服务器在响应该用户代理字符串时做了一些奇怪的事情,问题不在于requests

>>> import requests
>>> user_agent = 'foo'
>>> url = 'THE_DISCUS_URL'
>>> s = requests.Session()
>>> s.headers['User-Agent'] = user_agent
>>> r = s.get(url, allow_redirects=True, timeout=10)
>>> r.url
'https://www.elsevier.com/connect/could-dissolvable-microneedles-replace-injected-vaccines'

VS

>>> import requests
>>> user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'
>>> url = 'THE_DISCUS_URL'
>>> s = requests.Session()
>>> s.headers['User-Agent'] = user_agent
>>> r = s.get(url, allow_redirects=True, timeout=10)
>>> r.url
'THE_DISCUS_URL'

我很好奇,所以我调查了一下。响应的实际内容是带有链接的noscript标记,以及执行重定向的一些javascript。

这里可能会发生的事情是,如果铁饼看到真正的webbrowser用户代理,它会尝试通过javascript重定向(并且可能会在此过程中进行一系列跟踪)。另一方面,如果用户代理不熟悉,该站点假定访问者是一个脚本,可能无法执行javascript,只是重定向。