当前位置:首页 » 编程语言 » pythonsslhttps

pythonsslhttps

发布时间: 2023-05-12 07:17:53

‘壹’ 怎么解决使用python的requests获得网页时出现sslEOFError错误

  • importrequests

  • url="httplogin.html"

  • ret=requests.get(url,verify="/Test/ssl_address/qlchat.com.crt")

  • printret.status_code

  • 通过 verify 指定证书,表示相信此证书(52.77.252.184.crt 是服务器端证书);也可以用 verify=False,表示不验证服务器端的证书。

    https的证书获取:

    通过Chrome里面-设置-证书,可以导出该域名的ssl证书,然后放到指定路径,verify=证书路径。就能直接请求https了

‘贰’ python requests请求ssl 加密 提示[SSL: CA_MD_TOO_WEAK] ca md too weak (_ssl.c:4024)')))

服务器环境中的加密套件不支持这种加密方式。建议您升级一下加密套件版本到最新重新配置SSL。

‘叁’ python 链接https安装什么软件

今天写代码时碰到一个问题,花了几个小时的时间google,

首先需要安装openssl,更新到最新版本后,在浏览器里看是否可访问,如果是可以的,所以应该不是openssl有问题。
然后使用 curl尝试访问

curl -v
可以查看ssl版本,如果不能访问,尝试更换ssl版本

1
2
3
4
5

curl
-1

curl
-2 h

curl
-3

分别用上面的三句脚本去测试连接情况,发现第三种可以连接正常(-1,2,3,数字分别代码tlsv1,sslv2,sslv3三个不同的SSL版本)。说明这个https连接所在的服务器是基于SSLV3版本的。找到的问题,就很容易知道怎么改写Python代码了。

1
2
3
4
5
6
7
8
9

class MyAdapter(HTTPAdapter):
def init_poolmanager(self,
connections, maxsize):
self.poolmanager
= PoolManager(num_pools=connections,
maxsize=maxsize,
ssl_version=ssl.PROTOCOL_SSLv3)

s
= requests.Session()
s.mount('https://',
MyAdapter())#所有的https连接都用ssl.PROTOCOL_SSLV3去连接
s.get('')

urllib2实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

#
custom HTTPS opener, banner's oracle 10g server supports SSLv3 only
import httplib,
ssl, urllib2, socket
class HTTPSConnectionV3(httplib.HTTPSConnection):
def __init__(self,
*args,
**kwargs):
httplib.HTTPSConnection.__init__(self,
*args,
**kwargs)

def connect(self):
sock
= socket.create_connection((self.host,
self.port),
self.timeout)
if self._tunnel_host:
self.sock
= sock
self._tunnel()
try:
self.sock
= ssl.wrap_socket(sock,
self.key_file,
self.cert_file,
ssl_version=ssl.PROTOCOL_SSLv3)
except ssl.SSLError,
e:
print("Trying
SSLv3.")
self.sock
= ssl.wrap_socket(sock,
self.key_file,
self.cert_file,
ssl_version=ssl.PROTOCOL_SSLv23)

class HTTPSHandlerV3(urllib2.HTTPSHandler):
def https_open(self,
req):
return self.do_open(HTTPSConnectionV3,
req)
#
install opener
urllib2.install_opener(urllib2.build_opener(HTTPSHandlerV3()))

if __name__
== "__main__":
r
= urllib2.urlopen("https://ui2web1.apps.uillinois.e/BANPROD1/bwskfcls.P_GetCrse")
print(r.read())

可以看到这两种方案的原理都是一样,就是自定义连接处理器,改变连接时ssl的版本号。

‘肆’ python 获取https网站数据

一,检查pip有没安大模饥装cryptography,pyOpenSSL,certifi

pip install cryptography

pip install pyOpenSSL

pip install certifi

二码答,滚返添加ssl验证

import ssl

ssl._create_default_https_context = ssl._create_stdlib_context

三,添加header

header = {

"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.72 Safari/537.36 Edg/89.0.774.45"

}

四,调用requests的get接口

response = requests.get(url,headers=header)

content = response.text

print(content)

就能获取到html内容,如果需要更好的解释html标签内容可以使用 BeautifulSoup

‘伍’ python中的ssl error怎么解决

python安装完毕后,提示找不到ssl模块:
[root@localhost ~]# python2.7.5
Python 2.7.5 (default, Jun 3 2013, 11:08:43)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-54)] on linux2
Type "help", "right", "credits" or "license" for more information.
>>> import ssl
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
File "/usr/local/python27/lib/python2.7/ssl.py", line 60, in <mole>
import _ssl # if we can't import it, let the error propagate
ImportError: No mole named _ssl
>>>
2. 查看openssl安装包,发现缺少openssl-devel包
[root@localhost ~]# rpm -aq|grep openssl
openssl-0.9.8e-20.el5
openssl-0.9.8e-20.el5
[root@localhost ~]#
3. yum安装openssl-devel
[root@localhost ~]# yum install openssl-devel -y
#查看安装结果
[root@localhost ~]# rpm -aq|grep openssl
openssl-0.9.8e-26.el5_9.1
openssl-0.9.8e-26.el5_9.1
openssl-devel-0.9.8e-26.el5_9.1
openssl-devel-0.9.8e-26.el5_9.1
4. 重新编译python
#修改Setup文件
vi /usr/software/Python-2.7.5/Moles/Setup
#修改结果如下:
# Socket mole helper for socket(2)
_socket socketmole.c timemole.c
# Socket mole helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
#SSL=/usr/local/ssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto

5. 重新编译
make
make install
6. 测试,已可正常使用。
[root@localhost ~]# python2.7.5
Python 2.7.5 (default, Jun 3 2013, 14:56:13)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-54)] on linux2
Type "help", "right", "credits" or "license" for more information.
>>> import ssl
>>>

‘陆’ Python要求扔了sslerror问题,怎么解决

我在使用requests访问某个https网站时出现错误
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Session Objects会话对象

Session对象在请求时允许你坚持一定的参数。此外,还坚持由Session实例的所有请求的cookie。

让我们坚持在请求时使用

s = requests.Session()

s.get('httpsokie/123456789')
r = s.get("httrg/cookies")

print r.text
# '{"cookies": {"sessioncookie":"123456789"}}'

会话也可以用于提供默认的数据的请求的方法。这是通过提供的数据会话对象的属性:

s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'})

# both 'x-test' and 'x-test2' are sent
s.get('ht, headers={'x-test2': 'true'})

任何字典将被合并session级别的设置的值传递给请求方法。方法级别的参数覆盖会话参数。

从一个字典参数中取值

如果你想在一个session中删除一个参数,那么你只需要设置它为none,他便自动被删去。

在一个session中的所有值都包含直接提供给你。参阅Session API文档了解更多信息。

请求和响应对象

>>> r = requests.get('hia.org/wiki/Monty_Python')

查看

>>> r.headers
{'content-length': '56170', 'x-content-type-options': 'nosniff','x-cache':
'HIT from cp1006.eqiad.wmnet, MISS from cp1010.eqiad.wmnet','content-encoding':
'gzip', 'age': '3080', 'content-language': 'en', 'vary':'Accept-Encoding,Cookie',
'server': 'Apache', 'last-modified': 'Wed, 13 Jun 2012 01:33:50 GMT',
'connection': 'close', 'cache-control': 'private, s-maxage=0, max-age=0,
must-revalidate', 'date': 'Thu, 14 Jun 2012 12:59:39 GMT', 'content-type':
'text/html; charset=UTF-8', 'x-cache-lookup': 'HIT fromcp1006.eqiad.wmnet:3128,
MISS from cp1010.eqiad.wmnet:80'}

但是,如果我们想要得到我们的服务器发送的报头,我们只需访问请求,然后请求标头:

>>> r.request.headers
{'Accept-Encoding': 'identity, deflate, compress, gzip',
'Accept': '*/*', 'User-Agent': 'python-requests/1.2.0'}

准备请求

当你在API呼叫或会话呼叫收到一个Response对象,请求属性实际上是PreparedRequest使用。在某些情况下,发送请求之前,你不妨做一些额外的工作,身体或头(或任何其他真的)。这个简单的配方如下:

from requests import Request, Session

s = Session()
prepped = Request('GET', # or any other method, 'POST', 'PUT', etc.
url,
data=data
headers=headers
# ...
).prepare()
# do something with prepped.body
# do something with prepped.headers
resp = s.send(prepped,
stream=stream,
verify=verify,
proxies=proxies,
cert=cert,
timeout=timeout,
# etc.
)
print(resp.status_code)

既然你没有做什么特别的请求对象,你准备立即修改的PreparedRequest的对象。然后,您可以发送您所要发送的请求的其他参数。*或Sesssion中。*。

SSL证书验证

请求可以验证SSL证书的HTTPS请求,就像一个网络浏览器。检查主机的SSL证书,您可以使用校验参数:

>>> requests.get('httpreitz.com', verify=True)
requests.exceptions.SSLError: hostname 'kennethreitz.com' doesn't matcheither of '*.herokuapp.com', 'herokuapp.com'

我没有对这个域的SSL设置,所以它的失败。好极了 Github上虽然没有:

>>> requests.get('httpb.com', verify=True)
<Response [200]>

您也可以通过验证一个私人证书CA_BUNDLE文件的路径。您还可以设置环境变量的REQUESTS_CA_BUNDLE。

如果你设置验证设置为False,也可以忽略验证SSL证书。

>>> requests.get('httpethreitz.com',cert=('/path/server.crt', '/path/key'))
<Response [200]>

如果指定了错误的路径或无效的证书:

>>> requests.get('htreitz.com',cert='/wrong_path/server.pem')
SSLError: [Errno 336265225] _ssl.c:347: error:140B0009:SSLroutines:SSL_CTX_use_PrivateKey_file:PEM lib

主体内容工作流程

默认情况下,当你提出一个请求时,机体的反应是立即下载。您可以重写此行为,并推迟下载响应的身体,直到您访问Response.content,与流参数的属性:

tarball_url = 'httnnethreitz/requests/tarball/master'
r = requests.get(tarball_url, stream=True)

仅在这一点上已下载的响应头和连接保持打开状态,从而使我们能够使内容检索条件:

if int(r.headers['content-length']) < TOO_LONG:
content = r.content
...

您可以进一步控制的使用的Response.iter_content和Response.iter_lines方法的工作流程,或从基本的urllib3 urllib3.HTTPResponse在Response.raw阅读。

保持活动

需要注意的是发布的连接会回到池会重用所有以读取的数据:
确保为设置数据流false或阅读Response对象的内容属性。

上传

请求支持它允许你发送大量的没有读取到内存的流或文件流上传,。要流和上传,只需为你的身体提供了一个类似文件的对象:

with open('massive-body') as f:
requests.post('httpl/streamed', data=f)

块编码请求:

还请支持分块传输编码传出和传入的请求。要发送一个数据块编码的请求,只是提供一个生成器(或任何没有长度的迭代器)为您的BODY:

def gen():
yield 'hi'
yield 'there'

requests.post('http:/chunked', data=gen())

事件钩子:

请求有一个钩子,系统,你可以用它来处理申请过程中的部分或信号事件的处理。

您可以指定一个钩子函数在每个请求的基础上,通过一个{hook_name:callback_function}字典的钩请求参数:

hooks=dict(response=print_url)

那CALLBACK_FUNCTION将收到的数据块作为第一个参数。

>>> requests.get('httbin.org',hooks=dict(response=print_url))
<Response [200]>

自定义身份验证

这callback_function将收到一大块的数据作为第一个参数。

from requests.auth import AuthBase

class PizzaAuth(AuthBase):
"""Attaches HTTP Pizza Authentication tothe given Request object."""
def __init__(self, username):
# setup any auth-related datahere
self.username = username

def __call__(self, r):
# modify and return the request
r.headers['X-Pizza'] =self.username
return r

Then, we can make a request using our Pizza Auth:

>>> requests.get('httrg/admin',auth=PizzaAuth('kenneth'))
<Response [200]>

代理

import requests

proxies = {
"http": "ht:3128",
"https": "htt0.1.10:1080",
}

requests.get("hple.org", proxies=proxies)

您还可以配置代理服务器环境HTTP_PROXY and HTTPS_PROXY.

$ export HTTP_PROXY="http://10.10.1.10:3128"
$ export HTTPS_PROXY="http://10.10.1.10:1080"
$ python
>>> import requests
>>> requests.get("hple.org")

To use HTTP Basic Auth with your proxy, use the http://user:password@host/syntax:

proxies = {
"http":"[email protected]:3128/",
}

遵守:

要求是为了符合相关的规范和RFC的合规性,不会造成困难,为用户。这受到关注,可能会导致一些看似寻常的行为,可能对那些不熟悉有关规范。

编码:

如果没有明确的字符集是在HTTP头中的Content-Type头中包含文本。在这种情况下,RFC 2616指定默认的字符集必须是ISO-8859-1

HTTP动词

要求提供访问几乎是全方位的HTTP动词:GET,OPTIONS,HEAD,POST,PUT,PATCH和DELETE。下面提供了详细的例子,使用这些不同的动词在请求中,使用GitHub的API。

>>> import requests
>>> r =requests.get('httcom/repos/kennethreitz/requests/git/commits/')

因此,GitHub的返回JSON。我们可以使用r.json的方法来解析为Python对象。

>>> commit_data = r.json()
>>> print commit_data.keys()
[u'committer', u'author', u'url', u'tree', u'sha', u'parents', u'message']
>>> print commit_data[u'committer']
{u'date': u'2012-05-10T11:10:50-07:00', u'email': u'[email protected]',u'name': u'Kenneth Reitz'}
>>> print commit_data[u'message']
makin' history

请求可以很容易地使用各种形式的认证,包括很常见的基本身份验证。

>>> from requests.auth import HTTPBasicAuth
>>> auth = HTTPBasicAuth('[email protected]','not_a_real_password')
>>> r = requests.post(url=url, data=body, auth=auth)
>>> r.status_code
201
>>> content = r.json()
>>> print content[u'body']
Sounds great! I'll get right on it.

‘柒’ python环境设置ssl

爬取数据需要用python请求网络数据, https的加密实现依赖openssl

利用源码直接安装

安装zlib库

安装openssl到 /usr/local/openssl 目录,安装之后,编译

安装结孝蚂束后执行以下命令

进入/usr/local目录下,执行以下命令

在/etc/ld.so.conf文件的最后面,添加如下内容:/usr/local/openssl/lib
然后执行以下命令

添加OPESSL的环境变量,在etc/的profile的最后一行,添加:

查看openssl版本

使用源码按过于繁琐,如果对软件版本没有特殊要求的话可以巧森埋使用yum命令安装和更新,既方便又快捷

先看下ssl有没有被引入

报错是因为python没有带--with-ssl 选项编译
修改Setup.dist文件 (把Setup这个不带后缀的也一起改了)

修改结果如下:(去掉最后4行的注释)

切到春春python文件夹

完成之后

没有报错, 大功告成

参考链接
ImportError: No mole named _ssl
linux上安装Openssl步骤详解

热点内容
怎么找回建行登录密码 发布:2025-07-18 14:39:38 浏览:348
如何让安卓变得像苹果一样快 发布:2025-07-18 14:38:05 浏览:216
台安源码 发布:2025-07-18 14:35:32 浏览:601
下载种子怎么是php 发布:2025-07-18 14:35:00 浏览:5
linuxtimet 发布:2025-07-18 14:34:46 浏览:299
轻客有哪些安全配置 发布:2025-07-18 14:09:22 浏览:409
sql按月份分组 发布:2025-07-18 13:44:01 浏览:598
电脑怎么配置sva 发布:2025-07-18 13:32:06 浏览:148
如何找出隐藏的文件夹 发布:2025-07-18 13:19:15 浏览:829
钉钉直播脚本 发布:2025-07-18 13:12:10 浏览:192