python-使用urllib打开HTTPS链接失败

python-使用urllib打开HTTPS链接失败,python,ubuntu,https,beautifulsoup,urllib,Python,Ubuntu,Https,Beautifulsoup,Urllib,我在使用urlib打开具有HTTPS协议的链接时遇到问题。 我在Ubuntu中运行Python2.7.1,使用家庭网络(无代理) 它会一直返回并出错,如果我改为HTTP,它就会工作,我在这里遗漏了什么 代码示例: from BeautifulSoup import * import urllib url = "https://path/file.html" html = urllib.urlopen(url).read() 返回的错误: Traceback (most recent ca

我在使用urlib打开具有HTTPS协议的链接时遇到问题。 我在Ubuntu中运行Python2.7.1,使用家庭网络(无代理)

它会一直返回并出错,如果我改为HTTP,它就会工作,我在这里遗漏了什么

代码示例:

from BeautifulSoup import *

import urllib

url = "https://path/file.html"

html = urllib.urlopen(url).read()
返回的错误:

Traceback (most recent call last): 
  File "/home/.../links.py", line 4, in <module> html = urllib.urlopen(url).read()
    html = urllib.urlopen(url).read()
  File "/usr/lib/python2.7/urllib.py", line 87, in urlopen
    return opener.open(url)
  File "/usr/lib/python2.7/urllib.py", line 213, in open
    return getattr(self, name)(url)
  File "/usr/lib/python2.7/urllib.py", line 443, in open_https
    h.endheaders(data)
  File "/usr/lib/python2.7/httplib.py", line 1048, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python2.7/httplib.py", line 892, in _send_output
    self.send(msg)
  File "/usr/lib/python2.7/httplib.py", line 854, in send
    self.connect()
  File "/usr/lib/python2.7/httplib.py", line 1273, in connect
    server_hostname=server_hostname)
  File "/usr/lib/python2.7/ssl.py", line 352, in wrap_socket
    _context=self)
  File "/usr/lib/python2.7/ssl.py", line 579, in __init__
    self.do_handshake()
  File "/usr/lib/python2.7/ssl.py", line 808, in do_handshake
    self._sslobj.do_handshake()
IOError: [Errno socket error] [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)
回溯(最近一次呼叫最后一次):
文件“/home/../links.py”,第4行,在html=urllib.urlopen(url.read()中
html=urllib.urlopen(url.read())
文件“/usr/lib/python2.7/urllib.py”,urlopen中的第87行
返回opener.open(url)
文件“/usr/lib/python2.7/urllib.py”,第213行,打开
返回getattr(self,name)(url)
文件“/usr/lib/python2.7/urllib.py”,第443行,在OpenHTTPS中
h、 端头(数据)
文件“/usr/lib/python2.7/httplib.py”,第1048行,在endheaders中
自发送输出(消息体)
文件“/usr/lib/python2.7/httplib.py”,第892行,在发送输出中
self.send(msg)
文件“/usr/lib/python2.7/httplib.py”,第854行,在send中
self.connect()
文件“/usr/lib/python2.7/httplib.py”,第1273行,在connect中
服务器\主机名=服务器\主机名)
文件“/usr/lib/python2.7/ssl.py”,第352行,在wrap_套接字中
_上下文=自身)
文件“/usr/lib/python2.7/ssl.py”,第579行,在__
self.do_握手
文件“/usr/lib/python2.7/ssl.py”,第808行,在do_握手中
赛尔夫:握手
IOError:[Errno socket error][SSL:CERTIFICATE\u VERIFY\u FAILED]证书验证失败(\u SSL.c:590)
这不是最好的答案

我只有在使用不正确的SSL证书的服务器上才遇到这个问题,比如
https://pygame.org/

请求中
有禁用证书验证的选项

import requests

r = requests.get("https://pygame.org", verify=False)

html = r.content
使用验证脚本无法工作。未经验证,脚本显示警告,但有效

但是我在
urllib
中没有找到这个选项,这不是最好的答案

我只有在使用不正确的SSL证书的服务器上才遇到这个问题,比如
https://pygame.org/

请求中
有禁用证书验证的选项

import requests

r = requests.get("https://pygame.org", verify=False)

html = r.content
使用验证脚本无法工作。未经验证,脚本显示警告,但有效


但是我在
urllib
中没有找到此选项。我找到了解决方案,必须设置SSL代码

我的代码中缺少此部分

import requests
import json
import ssl

scontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
req = urllib.urlopen(url, context=scontext)
html = req.read()
`
通过这种方式可以浏览HTTPS网站

我找到了解决方案,必须设置SSL代码

我的代码中缺少此部分

import requests
import json
import ssl

scontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
req = urllib.urlopen(url, context=scontext)
html = req.read()
`
通过这种方式可以浏览HTTPS网站

是否有完整的错误消息?可能会有更多有用的信息。我用完整的错误消息更新了它。谢谢,这是完整的错误信息吗?可能会有更多有用的信息。我用完整的错误消息更新了它。感谢Trange,我的编译器说:ImportError:没有名为requests的模块,但我已经安装了该模块(
pip3 install requests--upgrade
pip3
为Python 3安装。使用
pip
安装Python2.true,抱歉,但与pip相同:
要求已经是最新的:在/usr/local/lib/python3.4/dist包中请求
我是否可能同时安装了Python2.7和3,这会造成混乱
python-V返回2.7.10
您的
pip
pip3
的别名-尝试
pip2
。或者编写
pip
并按两次
tab
查看所有以
pip
开头的命令。您可以同时使用2.7和3,并且您应该使用命令
python
python2
python2.7
python3.4
python3.4
pip
pip2
pip2.7
pip3
pip3.4
:)奇怪的是,我的编译器说:ImportError:没有名为requests的模块,但我已经安装了模块(
pip3 install requests--upgrade
pip3
为Python 3安装。使用
pip
安装Python2.true,抱歉,但与pip相同:
要求已经是最新的:在/usr/local/lib/python3.4/dist包中请求
我是否可能同时安装了Python2.7和3,这会造成混乱
python-V返回2.7.10
您的
pip
pip3
的别名-尝试
pip2
。或者编写
pip
并按两次
tab
查看所有以
pip
开头的命令。您可以同时使用2.7和3,并且您应该使用命令
python
python2
python2.7
python3.4
python3.4
pip
pip2
pip2.7
pip3
pip3.4
:)