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 相关文章推荐
利用Fn.py库在Python中进行函数式编程
Apr 22 Python
在Lighttpd服务器中运行Django应用的方法
Jul 22 Python
Python实现视频下载功能
Mar 14 Python
python简易实现任意位数的水仙花实例
Nov 13 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
Jan 29 Python
python使用pandas处理excel文件转为csv文件的方法示例
Jul 18 Python
如何利用python给图片添加半透明水印
Sep 06 Python
基于python操作ES实例详解
Nov 16 Python
Python读取表格类型文件代码实例
Feb 17 Python
python+selenium+PhantomJS抓取网页动态加载内容
Feb 25 Python
Python+OpenCV实现图像的全景拼接
Mar 05 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 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
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
PHP 强制性文件下载功能的函数代码(任意文件格式)
2010/05/26 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
php格式化日期实例分析
2014/11/12 PHP
Symfony2学习笔记之插件格式分析
2016/03/17 PHP
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
Javascript模块化编程(一)AMD规范(规范使用模块)
2013/01/17 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
Javascript字符串浏览器兼容问题分析
2014/12/01 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
浅谈在koa2中实现页面渲染的全局数据
2017/10/09 Javascript
微信小程序WebSocket实现聊天对话功能
2018/07/06 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
2018/07/12 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
从零学Python之引用和类属性的初步理解
2014/05/15 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
Django框架表单操作实例分析
2019/11/04 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
介绍一下Linux中的链接
2016/05/28 面试题
英文版餐饮运营管理求职信
2013/11/06 职场文书
给医务人员表扬信
2014/01/12 职场文书
高二物理教学反思
2014/02/08 职场文书
《那片绿绿的爬山虎》教学反思
2014/02/27 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
经理聘任证明
2015/03/02 职场文书
单位政审意见范文
2015/06/04 职场文书
辞职离别感言
2015/08/04 职场文书
react 项目中引入图片的几种方式
2021/06/02 Javascript
MySQL 5.7常见数据类型
2021/07/15 MySQL
前端实现滑动按钮AJAX与后端交互的示例代码
2022/02/24 Javascript
python数字类型和占位符详情
2022/03/13 Python