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 获取 Linux 系统信息的代码
Jul 13 Python
Unicode和Python的中文处理
Mar 19 Python
Python分析学校四六级过关情况
Nov 22 Python
python使用__slots__让你的代码更加节省内存
Sep 05 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
对python过滤器和lambda函数的用法详解
Jan 21 Python
Django 中间键和上下文处理器的使用
Mar 17 Python
python3中property使用方法详解
Apr 23 Python
解决python xx.py文件点击完之后一闪而过的问题
Jun 24 Python
Python简易计算器制作方法代码详解
Oct 31 Python
Tensorflow实现部分参数梯度更新操作
Jan 23 Python
对PyTorch中inplace字段的全面理解
May 22 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
PHP性能优化准备篇图解PEAR安装
2011/12/05 PHP
深入PHP autoload机制的详解
2013/06/09 PHP
php图片缩放实现方法
2014/02/20 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
jquery 批量上传图片实现代码
2010/01/28 Javascript
jQuery获取(选中)单选,复选框,下拉框中的值
2014/02/21 Javascript
javascript实现网站加入收藏功能
2015/12/16 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
运用js教你轻松制作html音乐播放器
2020/04/17 Javascript
微信小程序 Audio API详解及实例代码
2016/09/30 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
Node.js 的模块知识汇总
2017/08/16 Javascript
node上的redis调用优化示例详解
2018/10/30 Javascript
Element UI框架中巧用树选择器的实现
2018/12/12 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
用Python进行基础的函数式编程的教程
2015/03/31 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
2018/06/22 Python
python requests 测试代理ip是否生效
2018/07/25 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
Joules美国官网:出色的英国风格
2017/10/30 全球购物
法警的竞聘演讲稿
2014/01/02 职场文书
最新创业融资计划书
2014/01/19 职场文书
教学个人的自我评价分享
2014/02/16 职场文书
《姥姥的剪纸》教学反思
2014/02/25 职场文书
作文评语大全
2014/04/23 职场文书
Python自动化之批量处理工作簿和工作表
2021/06/03 Python
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技