指定HTTP协议会有所不同吗?

时间:2018-03-14 12:24:48

标签: python html http https http-headers

这两个bs4对象之间有区别吗?

from urllib2 import urlopen, Request
from bs4 import BeautifulSoup

req1 = Request("https://stackoverflow.com/")  # HTTPS
html1 = urlopen(req1).read()

req2 = Request("http://stackoverflow.com/")  # HTTP
html2 = urlopen(req2).read()

bsObj1 = BeautifulSoup(html1, "html.parser")
bsObj2 = BeautifulSoup(html2, "html.parser")

您真的需要指定HTTP协议吗?

2 个答案:

答案 0 :(得分:3)

这是我有限的理解:在这种情况下没有实际的区别。

我的理解是,大多数拥有https的网站都会将http网址重定向到https,就像这里的情况一样。站点可能同时具有http版本和https版本,在这种情况下,它们可能不会重定向。这将是不好的做法,但没有什么能阻止某人这样做。

我仍然会尽可能明确地使用https,这是最佳做法。

答案 1 :(得分:1)

通过HTTP协议进行的所有通信都使用HTTP动词GET,POST,PUT,DELETE。指定协议有两个目的:

1)它指定数据通信方案

一般URI的格式为:
方案:[// [user [:password] @] host [:port]] [/ path] [?query] [#fragie] ,常见的方案是 http(s), ftp,mailto,文件,数据和irc

2)它指定方案是否支持SSL加密

使用http方案,Send and Download中添加的' 可确保对数据进行SSL加密。

根据https Python docs

  

强烈建议始终使用SSL证书验证。为了启用验证,您需要一组根证书。最简单,最可靠的方法是使用提供Mozilla根证书包的urllib3包:

certifi

PoolManager 会自动处理证书验证,如果验证失败则会引发SSLError:

pip install certifi

>>> import certifi
>>> import urllib3
>>> http = urllib3.PoolManager(
...     cert_reqs='CERT_REQUIRED',
...     ca_certs=certifi.where())