如何使用Python获取网站的协议(http或https)

时间:2017-07-10 02:46:58

标签: python python-requests

我正在考虑如何模仿Chrome浏览器如何使用Python检测网站协议。例如,我们输入" stackoverflow.com"在地址栏上,然后按Enter键,浏览器可以自动检测并更改网址为" https://stackoverflow.com" (添加网站的协议),我想知道我们如何在Python中完成它,就像:

url = "stackoverflow.com"
browser = Browser (url) # Browser is a class that we can get website content from url, get its protocol,...
print browser.protocol
  

HTTPS

是否有任何图书馆或套餐可以帮助您做到这一点?非常感谢。

编辑:我的问题是独一无二的,因为如果我们输入http,其他问题会询问如何重定向到https,正如我所提到的,我们可以在没有伪协议的情况下在第一阶段自动检测吗?

3 个答案:

答案 0 :(得分:8)

它适用于stackoverflow,因为当您第一次访问端口80(http端口)上的stackoverflow.com时,stackoverflow的服务器会通知浏览器该链接已永久移动到https。

要在Python中检测相同内容,请使用requests库,如下所示:

>>> import requests
>>> r = requests.get('http://stackoverflow.com') # first we try http
>>> r.url # check the actual URL for the site
'https://stackoverflow.com/'

要了解网址的更改方式,请查看历史记录对象,您会看到301响应,这意味着URI有moved permanently到新地址。

>>> r.history[0]
<Response [301]>
>>> r.history[0].url # this is the original URL we tried
'http://stackoverflow.com/'

答案 1 :(得分:3)

当您输入不包含http://https://的网址时,浏览器会自动假定您正在使用http://并在端口80上发送请求。

如果网站将您重定向到https网站,您将获得两个标题。其中一个响应为301,表示非错误重定向。另一个是101,表示您正在升级您的连接类型。

如果您打开新标签页并加载http://stackexchange.com并在网络浏览器的开发者工具套件的网络标签页上看到包装,就会发现这种情况。

注意:

这两个代码都依赖于支持此行为的主机。并非所有网站都会自动将您重定向到https://网站。此外,并非所有这些都支持http2,因此您可能无法获得101升级。

如果您确实想确定https://是否是首选选项,您可能需要在未获得重定向时手动检查它是否存在。

答案 2 :(得分:1)

由于您提到了“浏览器”和“Chrome”行为,因此可以使用selenium获得与@ BurkhanKhalid非常好的答案相同的结果:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://stackoverflow.com") #Trying http first
url = driver.current_url

>>> print(url[:url.find(":")])
https