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 Web框架Flask中使用百度云存储BCS实例
Feb 08 Python
基于scrapy实现的简单蜘蛛采集程序
Apr 17 Python
python使用wxpython开发简单记事本的方法
May 20 Python
解决uWSGI的编码问题详解
Mar 24 Python
1分钟快速生成用于网页内容提取的xslt
Feb 23 Python
Python实用工具FuckIt.py介绍
Jul 02 Python
Python pandas库中的isnull()详解
Dec 26 Python
关于pytorch处理类别不平衡的问题
Dec 31 Python
Python try except异常捕获机制原理解析
Apr 18 Python
Python如何telnet到网络设备
Feb 18 Python
总结Python常用的魔法方法
May 25 Python
OpenCV-Python直方图均衡化实现图像去雾
Jun 07 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
比特率,大家看看这个就不用收音机音质去比MP3音质了
2021/03/01 无线电
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
PHP getName()函数讲解
2019/02/03 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
与jquery serializeArray()一起使用的函数,主要来方便提交表单
2011/01/31 Javascript
有关JavaScript的10个怪癖和秘密分享
2011/08/28 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
2014/04/07 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
js实现按钮颜色渐变动画效果
2015/08/20 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
详解关于Angular4 ng-zorro使用过程中遇到的问题
2018/12/05 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
12 种使用Vue 的最佳做法
2020/03/30 Javascript
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
python开发之文件操作用法实例
2015/11/13 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
Python3中列表list合并的四种方法
2019/04/19 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
Python numpy数组转置与轴变换
2019/11/15 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
python tkinter 设置窗口大小不可缩放实例
2020/03/04 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
Python使用20行代码实现微信聊天机器人
2020/06/05 Python
html5 canvas移动浏览器上实现图片压缩上传
2016/03/11 HTML / CSS
KIKO美国官网:意大利的平价彩妆品牌
2017/05/16 全球购物
介绍一下木马病毒的种类
2015/07/26 面试题
机械化及自动化毕业生的自我评价分享
2013/11/06 职场文书
给酒店员工的表扬信
2014/01/11 职场文书
拾金不昧通报表扬范文
2015/05/05 职场文书
2016春季运动会前导词
2015/11/25 职场文书
人生哲理妙语30条:淡写流年,笑过人生
2019/09/04 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书