我有一个Python脚本,可以通过不同方式从多个关联公司下载产品Feed。直到上周三开始抛出来自不同位置的各种超时异常时,这并没有给我任何问题。
示例:我在这里连接FTP服务:
ftp = FTP(host=self.host)
扔:
Exception in thread Thread-7:
Traceback (most recent call last):
File "C:\Python27\Lib\threading.py", line 810, in __bootstrap_inner
self.run()
File "C:\Python27\Lib\threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "C:\Users\Administrator\Documents\Crawler\src\Crawlers\LDLC.py", line 23, in main
ftp = FTP(host=self.host)
File "C:\Python27\Lib\ftplib.py", line 120, in __init__
self.connect(host)
File "C:\Python27\Lib\ftplib.py", line 138, in connect
self.welcome = self.getresp()
File "C:\Python27\Lib\ftplib.py", line 215, in getresp
resp = self.getmultiline()
File "C:\Python27\Lib\ftplib.py", line 201, in getmultiline
line = self.getline()
File "C:\Python27\Lib\ftplib.py", line 186, in getline
line = self.file.readline(self.maxline + 1)
File "C:\Python27\Lib\socket.py", line 476, in readline
data = self._sock.recv(self._rbufsize)
timeout: timed out
或下载XML文件:
xmlFile = urllib.URLopener()
xmlFile.retrieve(url, self.feedPath + affiliate + "/" + website + '.' + fileType)
xmlFile.close()
抛出:
File "C:\Users\Administrator\Documents\Crawler\src\Crawlers\FeedCrawler.py", line 106, in save
xmlFile.retrieve(url, self.feedPath + affiliate + "/" + website + '.' + fileType)
File "C:\Python27\Lib\urllib.py", line 240, in retrieve
fp = self.open(url, data)
File "C:\Python27\Lib\urllib.py", line 208, in open
return getattr(self, name)(url)
File "C:\Python27\Lib\urllib.py", line 346, in open_http
errcode, errmsg, headers = h.getreply()
File "C:\Python27\Lib\httplib.py", line 1139, in getreply
response = self._conn.getresponse()
File "C:\Python27\Lib\httplib.py", line 1067, in getresponse
response.begin()
File "C:\Python27\Lib\httplib.py", line 409, in begin
version, status, reason = self._read_status()
File "C:\Python27\Lib\httplib.py", line 365, in _read_status
line = self.fp.readline(_MAXLINE + 1)
File "C:\Python27\Lib\socket.py", line 476, in readline
data = self._sock.recv(self._rbufsize)
IOError: [Errno socket error] timed out
这些只是两个示例,但还有其他方法,例如authenticate或其他API特定方法,其中我的脚本会抛出这些超时错误。它直到周三才表现出这种行为。此外,它开始随机抛出它们。有时在爬行开始时,有时候在以后。我的脚本在我的服务器和本地计算机上都有此行为。我现在已经两天苦苦挣扎但似乎无法弄明白。
这是我所知道的可能导致的:
星期三,一个联盟脚本发生故障,出现以下错误:
URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>
我没有更改任何内容到我的脚本但突然停止抓取该联盟会员并在我尝试进行身份验证时始终抛出该错误。我查了一下,发现是由于OpenSSL错误(来自哪里)。我通过在authenticate方法之前添加以下内容来修复它:
if hasattr(ssl, '_create_unverified_context'):
ssl._create_default_https_context = ssl._create_unverified_context
我不知道,这只是我的问题的开始......同时,我从Python 2.7.8变为Python 2.7.9。似乎这是一切都崩溃并开始抛出超时的时刻。
我试图以无尽的方式改变我的剧本,但没有任何效果,就像我说的那样,它不仅仅是一种抛出它的方法。我也切换回Python 2.7.8,但这也没有做到。基本上,向外部源发出请求的所有内容都可能引发错误。
最后说明:我的脚本是多线程的。它同时从不同的关联公司下载产品Feed。它曾经为每个会员运行10个主题没有问题。现在我尝试将其降低到每个联盟会员3,但它仍然会抛出这些错误。将其设置为1是没有选择的,因为这需要很长时间。我不认为这是问题,因为它曾经工作得很好。
可能出现什么问题?