我只是在考虑如何模仿浏览器,比如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
是否有任何库或包可以帮助完成此操作?非常感谢。
编辑:我的问题是独一无二的,因为其他问题询问如果我们进入http,如何重定向到https,正如我提到的,我们能够在第一阶段自动检测到没有虚拟协议吗?
发布于 2017-07-09 18:56:51
它适用于堆栈溢出,因为当您第一次访问端口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/'
要了解URL是如何变化的,请查看历史对象,您将看到一个301响应,这意味着URI具有到新地址的永久移动。
>>> r.history[0]
<Response [301]>
>>> r.history[0].url # this is the original URL we tried
'http://stackoverflow.com/'
发布于 2017-07-09 19:00:33
当您输入一个没有http://
或https://
的url时,浏览器会自动假设您使用的是http://
,并在端口80上发送请求。
如果站点将您重定向到一个https
站点,您将得到两个值得注意的标题。一个将有一个301的响应,它表示一个非错误的重定向。另一个是101,它表示您正在升级连接类型。
如果您打开一个新的选项卡并加载http://stackexchange.com
并在您的web浏览器开发工具套件的网络选项卡上查看packes,您就会看到这种情况。
注意:
这两个代码都依赖于支持此行为的主机。并非所有网站都会自动将您重定向到https://
站点。此外,并不是所有这些程序都支持http2
,因此您可能无法获得101
升级。
如果您确实希望确定https://
是否是首选选项,则可能需要在没有重定向时手动检查它是否存在。
发布于 2017-07-09 19:03:30
由于您提到了“浏览器”和"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
https://stackoverflow.com/questions/45003098
复制