【问题标题】:python - Opening HTTPS links fails with urllibpython - 使用 urllib 打开 HTTPS 链接失败
【发布时间】:2016-02-01 02:09:56
【问题描述】:

我无法使用 urllib 打开具有 HTTPS 协议的链接。 我正在使用家庭网络(无代理)在 Ubuntu 中运行 python 2.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)

【问题讨论】:

  • 是完整的错误信息吗?可以有更多有用的信息。
  • 我用完整的错误信息更新了它。谢谢

标签: python ubuntu https beautifulsoup urllib


【解决方案1】:

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

我的代码中缺少这部分!

import requests
import json
import ssl

scontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
req = urllib.urlopen(url, context=scontext)
html = req.read()

` 这样就可以通过HTTPS网站了

【讨论】:

    【解决方案2】:

    这不是最佳答案。

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

    request 中有禁用证书验证的选项。

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

    使用验证脚本不起作用。没有验证脚本显示警告但有效。

    但我在urllib 中没有找到这个选项。

    【讨论】:

    • 奇怪,我的编译器说:ImportError: No module named requests,但我已经安装了模块 (pip3 install requests --upgrade)
    • pip3 为 Python 3 安装。使用pip 为 Python 2 安装。
    • 是的,对不起,但与 pip 相同:Requirement already up-to-date: requests in /usr/local/lib/python3.4/dist-packages 我是否有可能同时安装了 python 2.7 和 3,这会造成混乱? python -V returns 2.7.10
    • 您的 pippip3 的别名 - 试试 pip2。或写pip 并按两次tab 以查看所有以pip 开头的命令
    • 你可以同时拥有 2.7 和 3 - 你应该有命令 python, python2, python2.7, python3python3.4 - 和 pip, @ 987654342@, pip2.7, pip3, pip3.4 :)
    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2017-10-20
    • 2022-12-21
    • 1970-01-01
    • 2022-11-23
    • 2013-10-11
    相关资源
    最近更新 更多