我正在考虑如何模仿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,正如我所提到的,我们可以在没有伪协议的情况下在第一阶段自动检测吗?
答案 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