davidmou 发表于 2023-8-18 18:04:37

urllib 问题

import urllib.request
import ssl

url = "https: //dict.youdao.com/webtranslate"
ssl._create_default_https_context = ssl._create_unverified_context()

req = urllib.request.Request(url)
d = urllib.request.urlopen(req)

导入了ssl模块,为什么还会报错,请大神帮忙更正

isdkz 发表于 2023-8-18 18:04:48

您好!根据您提供的代码,您导入了ssl模块并尝试创建一个未经验证的SSL上下文。然而,您可能遇到了一个常见的错误。

在Python 3中,urllib库默认使用了验证SSL证书的上下文。因此,您不需要手动创建未经验证的上下文。

要解决这个问题,您只需要删除以下这行代码:

ssl._create_default_https_context = ssl._create_unverified_context()

然后,您的代码应该像这样:

import urllib.request

url = "https: //dict.youdao.com/webtranslate"

req = urllib.request.Request(url)
d = urllib.request.urlopen(req)

这样,您的代码应该能够正常运行而不会报错了。

希望能帮到您!如果您还有其他问题,请随时提问。

陶远航 发表于 2023-8-18 18:05:14

根据你提供的代码,你希望通过urllib.request模块发送一个HTTPS请求。在Python 3中,默认情况下,urllib.request会验证SSL证书。但是,你可以通过设置上下文(context)来创建一个不验证SSL证书的HTTPS请求。

在你的代码中,你尝试通过设置ssl._create_default_https_context来创建一个不验证SSL证书的上下文。然而,由于你导入的ssl模块并不具备_create_default_https_context属性,所以会报错。

为了创建一个不验证SSL证书的上下文,你可以使用ssl.create_default_context()方法,并设置check_hostname和verify_mode参数。以下是修正后的代码:

import urllib.request
import ssl

url = "https://dict.youdao.com/webtranslate"

context = ssl.create_default_context()
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE

req = urllib.request.Request(url)
d = urllib.request.urlopen(req, context=context)


修正后的代码中,我们使用ssl.create_default_context()创建了一个默认的SSL上下文对象。然后,我们设置check_hostname为False以禁用主机名检查,将verify_mode设置为ssl.CERT_NONE以禁用证书验证。

这样,你就可以成功地发送HTTPS请求并获取响应了。

希望能解决你的问题!如果还有其他疑问,请随时提问。
如果问题已经解决,请设置最佳答案

学习编程中的Ben 发表于 2023-8-18 18:05:21

问题分析:
你在使用urllib库发送HTTPS请求时,导入了ssl模块并调用了ssl._create_default_https_context = ssl._create_unverified_context()来取消验证SSL证书。然而,你仍然遇到了报错。

解决方案:
报错可能是因为在取消验证SSL证书之后,未正确地设置到urllib中。你需要将自定义的SSL上下文应用于urllib的请求中。

下面是修改后的代码,请参考:

import urllib.request
import ssl

url = "https://dict.youdao.com/webtranslate"

context = ssl._create_unverified_context()
req = urllib.request.Request(url)
d = urllib.request.urlopen(req, context=context)


在这个修改后的代码中,我创建了一个自定义的SSL上下文context,并将其传递给urlopen()函数的context参数。这样就可以确保SSL上下文被正确应用于HTTPS请求,从而取消SSL证书验证。

请尝试运行修改后的代码,查看是否能够成功发送HTTPS请求。如果问题仍然存在,请提供更详细的错误信息,以便我能够进一步帮助你解决问题。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-8-18 18:08:50

本帖最后由 isdkz 于 2023-8-18 18:09 编辑

这里是不需要括号的

错误的写法:
ssl._create_default_https_context = ssl._create_unverified_context()

正确的写法:
ssl._create_default_https_context = ssl._create_unverified_context

页: [1]
查看完整版本: urllib 问题