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中使用urllib2防止302跳转的代码例子
Jul 07 Python
Python使用MD5加密字符串示例
Aug 22 Python
python获取指定时间差的时间实例详解
Apr 11 Python
Python读取txt某几列绘图的方法
Oct 14 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
Python队列RabbitMQ 使用方法实例记录
Aug 05 Python
pygame实现俄罗斯方块游戏(基础篇3)
Oct 29 Python
基于python中__add__函数的用法
Nov 25 Python
Python如何访问字符串中的值
Feb 09 Python
python对 MySQL 数据库进行增删改查的脚本
Oct 22 Python
Python txt文件如何转换成字典
Nov 03 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
Dec 24 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
BBS(php &amp; mysql)完整版(六)
2006/10/09 PHP
PHP实现时间轴函数代码
2011/10/08 PHP
php创建sprite
2014/02/11 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
PHP浮点数精度问题汇总
2015/05/13 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
一个简单的弹性返回顶部JS代码实现介绍
2013/06/09 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
2013/12/24 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
vue中接口域名配置为全局变量的实现方法
2018/09/20 Javascript
Angular(5.2-&gt;6.1)升级小结
2018/12/27 Javascript
简述pm2常用命令集合及配置文件说明
2019/05/30 Javascript
vue如何实现动态加载脚本
2020/02/05 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
Vue实现简单计算器
2021/01/20 Vue.js
Linux环境下MySQL-python安装过程分享
2015/02/02 Python
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
python查看FTP是否能连接成功的方法
2015/07/30 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
python模糊图片过滤的方法
2018/12/14 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
如何Tkinter模块编写Python图形界面
2020/10/14 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
护理专科毕业自荐信范文
2014/04/21 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书