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中Iterator迭代器的使用杂谈
Jun 20 Python
python实现ID3决策树算法
Dec 20 Python
详解Tensorflow数据读取有三种方式(next_batch)
Feb 01 Python
解决python3 pika之连接断开的问题
Dec 18 Python
对python模块中多个类的用法详解
Jan 10 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 Python
Python3.7安装keras和TensorFlow的教程图解
Jun 18 Python
python 实现矩阵按对角线打印
Nov 29 Python
Python操作redis和mongoDB的方法
Dec 19 Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 Python
Python模块future用法原理详解
Jan 20 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根据日期判断星座的函数分享
2014/02/13 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
DOM_window对象属性之--clipboardData对象操作代码
2011/02/03 Javascript
基于jquery的lazy loader插件实现图片的延迟加载[简单使用]
2011/05/07 Javascript
jQuery.extend 函数的详细用法
2012/06/27 Javascript
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
JS验证字符串功能
2017/02/22 Javascript
vue+axios实现登录拦截的实例代码
2017/05/22 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
Vue组件间数据传递的方式(3种)
2020/07/13 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
python中Genarator函数用法分析
2015/04/08 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
python将一个英文语句以单词为单位逆序排放的方法
2018/12/20 Python
python实现合并两个排序的链表
2019/03/03 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
2019/04/18 Python
python时间time模块处理大全
2020/10/25 Python
CSS3动画和HTML5新特性详解
2020/08/31 HTML / CSS
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
jQuery treeview树形结构应用
2021/03/24 jQuery
大学生实习思想汇报
2014/01/12 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
英文商务邀请函范文
2015/01/31 职场文书
2015年专项整治工作总结
2015/04/03 职场文书
项目合作意向书
2015/05/08 职场文书
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS
Java集成swagger文档组件
2021/06/28 Java/Android