python socket 超时设置 errno 10054


Posted in Python onJuly 01, 2014

python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接。问题解决方案:

前几天使用python读取网页。因为对一个网站大量的使用urlopen操作,所以会被那个网站认定为攻击行为。有时就不再允许下载。导致urlopen()后,request.read()一直卡死在那里。最后会抛出errno 10054.

这个错误是connection reset by peer.也就是传说的远端主机重置了此连接。原因可能是socket超时时间过长;也可能是request = urllib.request.urlopen(url)之后,没有进行request.close()操作;也可能是没有sleep几秒,导致网站认定这种行为是攻击。

具体解决方案如下面的代码:

01.import socket 
02.import time 
03.timeout = 20  
04.socket.setdefaulttimeout(timeout)#这里对整个socket层设置超时时间。后续文件中如果再使用到socket,不必再设置  
05.sleep_download_time = 10 
06.time.sleep(sleep_download_time) #这里时间自己设定  
07.request = urllib.request.urlopen(url)#这里是要读取内容的url  
08.content = request.read()#读取,一般会在这里报异常  
09.request.close()#记得要关闭

因为urlopen之后的read()操作其实是调用了socket层的某些函数。所以设置socket缺省超时时间,就可以让网络自己断掉。不必在read()处一直等待。

当然你也可以再外层再写几个try,except,例如:

try: 
  time.sleep(self.sleep_download_time) 
  request = urllib.request.urlopen(url) 
  content = request.read() 
  request.close() 
   
except UnicodeDecodeError as e: 
     
  print('-----UnicodeDecodeError url:',url) 
   
except urllib.error.URLError as e: 
  print("-----urlError url:",url) 
 
except socket.timeout as e: 
  print("-----socket timout:",url)

一般来说就莫有问题了。我测试了几千个网页的下载,然后才说出此话。不过如果是下载成千上万的,我做了下测试,ms还是会跳出这个异常。可能是time.sleep()的时间太短,也可能是网络突然中断。我使用urllib.request.retrieve()测试了一下,发现不停的下载数据,总会有失败的情况出现。

简单的处理方法是:首先参照的我的文章:python检查点简单实现 。先做一个检查点。然后将以上会跑出异常的那段代码while True一下。参见下面的伪代码:

def Download_auto(downloadlist,fun,sleep_time=15): 
  while True:     
    try: # 外包一层try  
      value = fun(downloadlist,sleep_time) # 这里的fun是你的下载函数,我当函数指针传进来。 
      # 只有正常执行方能退出。  
      if value == Util.SUCCESS: 
        break 
    except : # 如果发生了10054或者IOError或者XXXError 
      sleep_time += 5 #多睡5秒,重新执行以上的download.因为做了检查点的缘故,上面的程序会从抛出异常的地方继续执行。防止了因为网络连接不稳定带来的程序中断。 
      print('enlarge sleep time:',sleep_time)

不过对于找不到相应的网页,又要做另外的一番处理:

# 打印下载信息  
def reporthook(blocks_read, block_size, total_size): 
  if not blocks_read: 
    print ('Connection opened') 
  if total_size < 0: 
    print ('Read %d blocks' % blocks_read) 
  else: 
    # 如果找不到,页面不存在,可能totalsize就是0,不能计算百分比  
    print('downloading:%d MB, totalsize:%d MB' % (blocks_read*block_size/1048576.0,total_size/1048576.0)) 
    
 
def Download(path,url): 
#url = 'http://downloads.sourceforge.net/sourceforge/alliancep2p/Alliance-v1.0.6.jar' 
  #filename = url.rsplit("/")[-1]  
  try: 
  # python自带的下载函数  
    urllib.request.urlretrieve(url, path, reporthook) 
  except IOError as e: # 如果找不到,好像会引发IOError。 
    print("download ",url,"/nerror:",e) 
  print("Done:%s/nCopy to:%s" %(url,path))

如果大家还是遇到了问题...请再评论里注上其他解决方案。

Python 相关文章推荐
Python使用爬虫猜密码
Feb 19 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
Jun 16 Python
numpy排序与集合运算用法示例
Dec 15 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
pandas 选择某几列的方法
Jul 03 Python
Linux下python3.7.0安装教程
Jul 30 Python
对Python实现累加函数的方法详解
Jan 23 Python
Python实现简单查找最长子串功能示例
Feb 26 Python
在pandas中遍历DataFrame行的实现方法
Oct 23 Python
parser.add_argument中的action使用
Apr 20 Python
python中使用input()函数获取用户输入值方式
May 03 Python
Python实现GIF动图以及视频卡通化详解
Dec 06 Python
python设置检查点简单实现代码
Jul 01 #Python
如何搜索查找并解决Django相关的问题
Jun 30 #Python
python字典多条件排序方法实例
Jun 30 #Python
python实现的解析crontab配置文件代码
Jun 30 #Python
全面解读Python Web开发框架Django
Jun 30 #Python
Python科学计算环境推荐——Anaconda
Jun 30 #Python
9种python web 程序的部署方式小结
Jun 30 #Python
You might like
利用js调用后台php进行数据处理原码
2006/10/09 PHP
PHP哈希表实现算法原理解析
2020/12/11 PHP
imagettftext() 失效,不起作用
2021/03/09 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
javascript中常用编程知识
2013/04/08 Javascript
用JS实现3D球状标签云示例代码
2013/12/01 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
jQuery事件绑定和委托实例
2014/11/25 Javascript
js给selected添加options的方法
2015/05/06 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
jQuery给指定的table动态添加删除行的操作方法
2016/10/12 Javascript
详解AngularJS通过ocLazyLoad实现动态(懒)加载模块和依赖
2017/03/01 Javascript
Angular4学习笔记之准备和环境搭建项目
2017/08/01 Javascript
用jquery获取select标签中选中的option值及文本的示例
2018/01/25 jQuery
vue使用echarts图表的详细方法
2018/10/22 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
PyQt5组件读取参数的实例
2019/06/25 Python
python点击鼠标获取坐标(Graphics)
2019/08/10 Python
Python socket聊天脚本代码实例
2020/01/02 Python
浅谈在JupyterNotebook下导入自己的模块的问题
2020/04/16 Python
Python基于pyjnius库实现访问java类
2020/07/31 Python
HTML5中通过li-canvas轻松实现单图、多图、圆角图绘制,单行文字、多行文字等
2018/11/30 HTML / CSS
商务英语广告词大全
2014/03/18 职场文书
贷款承诺书范文
2014/05/19 职场文书
男方婚礼答谢词
2015/01/20 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
浅谈Python3中datetime不同时区转换介绍与踩坑
2021/08/02 Python
win10拖拽文件时崩溃怎么解决?win10文件不能拖拽问题解决方法
2022/08/14 数码科技