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二叉树的实现实例
Nov 21 Python
Python操作SQLite简明教程
Jul 10 Python
收集的几个Python小技巧分享
Nov 22 Python
Python入门之三角函数tan()函数实例详解
Nov 08 Python
TensorFlow入门使用 tf.train.Saver()保存模型
Apr 24 Python
Django安装配置mysql的方法步骤
Oct 15 Python
python3 实现对图片进行局部切割的方法
Dec 05 Python
Dlib+OpenCV深度学习人脸识别的方法示例
May 14 Python
使用tensorflow进行音乐类型的分类
Aug 14 Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 Python
python音频处理的示例详解
Dec 23 Python
Python xlwings插入Excel图片的实现方法
Feb 26 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以指定字段为索引返回数据库所取的数据数组
2013/06/30 PHP
ThinkPHP连接数据库的方式汇总
2014/12/05 PHP
CodeIgniter删除和设置Cookie的方法
2015/04/07 PHP
php编写简单的文章发布程序
2015/06/18 PHP
基础的WordPress插件制作教程
2015/11/24 PHP
在视频前插入广告
2006/11/20 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
jQuery使用each方法与for语句遍历数组示例
2016/06/16 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
详解vue父子组件间传值(props)
2017/06/29 Javascript
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
九步学会Python装饰器
2015/05/09 Python
TensorFlow高效读取数据的方法示例
2018/02/06 Python
python实现扫描局域网指定网段ip的方法
2019/04/16 Python
python网络编程 使用UDP、TCP协议收发信息详解
2019/08/29 Python
python中web框架的自定义创建
2019/09/08 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
2019/11/07 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
Html5 webRTC简单实现视频调用的示例代码
2020/09/23 HTML / CSS
罗德与泰勒百货官网:Lord & Taylor
2016/08/12 全球购物
weblogic面试题
2016/03/07 面试题
C#笔试题
2015/07/14 面试题
EJB的基本架构
2016/09/22 面试题
信用社实习人员自我鉴定
2013/09/20 职场文书
历史专业个人求职信分享
2013/12/20 职场文书
学习党的群众路线实践活动思想汇报
2014/09/12 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
北大自主招生自荐信
2015/03/04 职场文书
详解CSS中postion和opacity及cursor的特性
2022/08/14 HTML / CSS