urllib.request.urlopen()URLError

时间:2016-10-18 06:06:30

标签: python-3.x urllib

我试图打开https://ibmdatawarehousing.wordpress.com/category/theme-ibm-data-warehouse/

## all imports
from IPython.display import HTML
import numpy as np
import urllib.request, urllib.error
import bs4 #this is beautiful soup
import time
import operator
import socket
import pickle
import re # regular expressions

from pandas import Series
import pandas as pd
from pandas import DataFrame

import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline

import seaborn as sns
sns.set_context("talk")
sns.set_style("white")

from secret import *    
url = 'http://www.crummy.com/software/BeautifulSoup/'
source = urllib.request.urlopen(url).read()
print(source)

但它返回了一个错误,我已经搜索过但无法找到任何解决方案。它适用于其他网站。

SSLEOFError                               Traceback (most recent call last)
/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py in do_open(self, http_class, req, **http_conn_args)
   1253             try:
-> 1254                 h.request(req.get_method(), req.selector, req.data, headers)
   1255             except OSError as err: # timeout error

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py in do_open(self, http_class, req, **http_conn_args)
   1254                 h.request(req.get_method(), req.selector, req.data, headers)
   1255             except OSError as err: # timeout error
-> 1256                 raise URLError(err)
   1257             r = h.getresponse()
   1258         except:

URLError: <urlopen error EOF occurred in violation of protocol (_ssl.c:645)>

谢谢,

1 个答案:

答案 0 :(得分:0)

网站http://www.crummy.com/software/BeautifulSoup/在访问时使用SSL重定向到https的事实解释了为什么SSL存在问题。 SSLEOFError表示基础SSL连接突然终止。由于它确实对我来说工作正常,您确定您的网络按预期工作吗?您可能会坐在某种代理之后,这会给您带来SSL问题或者不允许SSL连接(例如,由于缺少根证书而允许代理拦截连接)。

您也可以尝试通过添加自定义SSL上下文来忽略证书(Python&gt; = 2.7.9 / 3.4.3):

import ssl

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

urllib.requests.urlopen("https://the.url/path", context=context).read() # ...

但是,我不确定这是否能解决您的问题,因为即使在检查证书之前也可能发生错误(例如,在潜在代理只是中止SSL连接的情况下)。

旁注/建议:还有一个很好的其他Python模块requests,它使HTTP请求更加简单。