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

2024-04-29 10:30:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是在想我们怎样才能模仿浏览器,比如Chrome,用Python来检测网站的协议。例如,我们在地址栏上键入“stackoverflow.com”,然后按Enter键,浏览器可以自动检测并将url更改为“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

有什么库或包可以帮助完成这项工作吗?谢谢。

编辑:我的问题是唯一的,因为其他问题问如何重定向到https如果我们进入http,如我所提到的,我们可以在没有虚拟协议的第一阶段自动检测吗?


Tags: httpsbrowsercomurl协议get键入网站
3条回答

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

如果该站点将您重定向到https站点,您将得到两个说明标题。一个将有一个表示无错误重定向的301响应。另一个是101,这表示您正在升级连接类型。

如果您打开一个新的选项卡并加载http://stackexchange.com,并在web浏览器的开发人员工具套件的“网络”选项卡上查看这些包时,就会看到这种情况。

注:

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

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

由于您提到了“浏览器”和“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

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

要在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/'

要了解URL是如何更改的,请查看history对象,您将看到一个301响应,这意味着URI已经moved permanently到了一个新地址。

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

相关问题 更多 >