ahu*_*ura 4 python web-scraping python-3.x python-requests
我正在编写一个脚本来找出大量缩短的 URL 导致的完整 URL。我使用 requests 模块来跟踪重定向并获取在浏览器中输入 URL 时最终会到达的 URL。这适用于几乎所有链接缩短程序,但由于我无法弄清楚的原因,对于 disq.us 形式的 URL 失败(即,对于 disq.us URL,我得到与我输入的相同的 url,而当我在浏览器中输入它时,我得到重定向)
下面的代码片段可以正确解析 bit.ly 缩短的链接,但会因 disq.us 链接而失败。我使用 Python 3.6.4 和 requests 模块的 2.18.4 版本运行它。SO 不允许我在问题中包含缩短的 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)
Run Code Online (Sandbox Code Playgroud)
你的第一个 URL 对我来说是 404。有趣的是,我只是用第二个网址尝试了这个,它有效,但我使用了不同的用户代理。然后我用你的用户代理尝试了它,它没有重定向。
这表明网络服务器正在做一些奇怪的事情来响应该用户代理字符串,并且问题不在于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'
Run Code Online (Sandbox Code Playgroud)
与
>>> 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'
Run Code Online (Sandbox Code Playgroud)
我很好奇,所以我进一步调查了一些。响应的实际内容是带有链接的 noscript 标记,以及一些执行重定向的 javascript。
这里可能发生的情况是,如果 Discus 看到一个真正的网络浏览器用户代理,它会尝试通过 javascript 进行重定向(并且可能在此过程中进行大量跟踪)。另一方面,如果用户代理不熟悉,站点会假设访问者是一个脚本,它可能无法执行 JavaScript,而只是重定向。