【问题标题】:How to get requests 'get' to follow all redirects如何获取“获取”请求以遵循所有重定向
【发布时间】:2018-05-01 03:38:20
【问题描述】:

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

下面是一个 sn-p,它正确地解析了 bit.ly-shortened 链接,但由于 disq.us-link 而失败。我使用 Python 3.6.4 和 requests 模块的 2.18.4 版本运行它。 所以不允许我在问题中包含缩短的 URL,所以我会在评论中留下这些。

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)

【问题讨论】:

  • 示例网址:pastebin.com/raw/d1epSGcb
  • 你能提供disqus url的错误信息吗?它对我来说很好。
  • @bro-grammer 没有错误,它只是没有重定向。它会打印我输入的相同 (disq.us/randomalphanum) URL,而如果你把它放在浏览器中,它会将你发送到其他地方。

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


【解决方案1】:

您的第一个 URL 对我来说是 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'

对比

>>> 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。

这里可能发生的情况是,如果 discus 看到一个真正的网络浏览器用户代理,它会尝试通过 javascript 进行重定向(并且可能在此过程中进行大量跟踪)。另一方面,如果用户代理不熟悉,网站会假定访问者是一个脚本,它可能无法执行 javascript,而只是重定向。

【讨论】:

  • 你能添加你正在使用的用户代理吗?
  • 完成。显然你不能直接在这里发布铁饼网址?我想知道你为什么使用 pastebin!
  • 不,我的问题被拒绝了,因为不允许使用缩短的 URL。
  • 我更新了一个解释。如果没有比我想做的更多的调查,我无法 100% 确信这是正确的,但我有理由确定这是正确的想法。
  • riiight,这是因为请求不运行 javascript!当然!令人讨厌的是,标头对于其他一些重定向工作是必需的。在此找到另一个问题,因此将其标记为重复。 stackoverflow.com/questions/41352373/…
猜你喜欢
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 2019-01-18
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
相关资源
最近更新 更多