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函数式编程
Jun 09 Python
Python中的index()方法使用教程
May 18 Python
Python os模块学习笔记
Jun 21 Python
全面解析Python的While循环语句的使用方法
Oct 13 Python
Python基于scapy实现修改IP发送请求的方法示例
Jul 08 Python
Python正确重载运算符的方法示例详解
Aug 27 Python
详解Python 装饰器执行顺序迷思
Aug 08 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
Dec 24 Python
详解numpy.meshgrid()方法使用
Aug 01 Python
如何利用python给图片添加半透明水印
Sep 06 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
在keras里面实现计算f1-score的代码
Jun 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
PHP数据缓存技术
2007/02/14 PHP
PHP 正则表达式常用函数
2014/08/17 PHP
PHP闭包函数详解
2016/02/13 PHP
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
jquery获取元素索引值index()示例
2014/02/13 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
jQuery Validate验证框架经典大全
2015/09/23 Javascript
JavaScript对HTML DOM使用EventListener进行操作
2015/10/21 Javascript
jQuery Mobile 和 Kendo UI 的比较
2016/05/05 Javascript
Angular 应用技巧总结
2016/09/14 Javascript
js实现表格筛选功能
2017/01/18 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
vue实现百度搜索功能
2020/12/28 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
windows下python连接oracle数据库
2017/06/07 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
python 弧度与角度互转实例
2020/04/15 Python
结束运行python的方法
2020/06/16 Python
斯洛伐克最大的婴儿食品和用品网上商店:Feedo.sk
2020/12/21 全球购物
医院办公室主任职责
2013/12/29 职场文书
研讨会主持词
2014/04/02 职场文书
学生保证书范文
2014/04/28 职场文书
寻找最美家庭活动方案
2014/08/20 职场文书
法院授权委托书格式
2014/09/28 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
2015年试用期自我评价范文
2015/03/10 职场文书
SQL Server2019数据库备份与还原脚本,数据库可批量备份
2021/11/20 SQL Server
使用 Apache 反向代理的设置技巧
2022/01/18 Servers