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操作MySQL数据库具体方法
Oct 28 Python
python脚本实现xls(xlsx)转成csv
Apr 10 Python
Python计算字符宽度的方法
Jun 14 Python
详解Python中的type和object
Aug 15 Python
Python实现京东秒杀功能代码
May 16 Python
Python实现制度转换(货币,温度,长度)
Jul 14 Python
django基于cors解决跨域请求问题详解
Aug 06 Python
Django错误:TypeError at / 'bool' object is not callable解决
Aug 16 Python
python Kmeans算法原理深入解析
Aug 23 Python
使用python去除图片白色像素的实例
Dec 12 Python
python模拟斗地主发牌
Apr 22 Python
全网最全python库selenium自动化使用详细教程
Jan 12 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
用cookies来跟踪识别用户
2006/10/09 PHP
PHP 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
php下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
Yii使用Captcha验证码的方法
2015/12/28 PHP
PHP编程中尝试程序并发的几种方式总结
2016/03/21 PHP
Yii中的cookie的发送和读取
2016/07/27 PHP
php分页原理 分页代码 分页类制作教程
2016/09/23 PHP
php pdo操作数据库示例
2017/03/10 PHP
laravel框架关于搜索功能的实现
2018/03/15 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
javascript 写类方式之九
2009/07/05 Javascript
javascript attachEvent绑定多个事件执行顺序问题
2010/10/20 Javascript
关于JavaScript中原型继承中的一点思考
2012/07/25 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
2018/06/24 Javascript
vue-cli 2.*中导入公共less文件的方法步骤
2018/11/22 Javascript
vue实现计算器功能
2020/02/22 Javascript
[40:19]2018完美盛典CS.GO表演赛
2018/12/17 DOTA
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
python搭建虚拟环境的步骤详解
2016/09/27 Python
Python  unittest单元测试框架的使用
2018/09/08 Python
pandas DataFrame 删除重复的行的实现方法
2019/01/29 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
pandas 时间格式转换的实现
2019/07/06 Python
俄罗斯护发和专业化妆品购物网站:Hihair
2019/09/28 全球购物
员工薪酬福利制度
2014/01/17 职场文书
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
竞选班长的演讲稿
2014/04/24 职场文书
大学生就业求职信
2014/06/12 职场文书
会计岗位职责范本
2015/04/02 职场文书
婚庆主持词大全
2015/06/30 职场文书
副校长2015年教育教学工作总结
2015/07/27 职场文书
2019感恩宣传标语!
2019/07/05 职场文书
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript