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中序列的修改、散列与切片详解
Aug 27 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
Apr 26 Python
python socket网络编程之粘包问题详解
Apr 28 Python
python 以16进制打印输出的方法
Jul 09 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
使用python快速在局域网内搭建http传输文件服务的方法
Nov 14 Python
tensorflow查看ckpt各节点名称实例
Jan 21 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
浅谈JupyterNotebook导出pdf解决中文的问题
Apr 22 Python
python的help函数如何使用
Jun 11 Python
用python批量移动文件
Jan 14 Python
Pandas加速代码之避免使用for循环
May 30 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利用header函数下载各种文件
2016/08/24 PHP
Laravel 队列使用的实现
2019/01/08 PHP
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
JS预览图像将本地图片显示到浏览器上
2013/08/25 Javascript
jQuery将表单序列化成一个Object对象的实例
2016/11/29 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
2019/05/12 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
Node.js安装详细步骤教程(Windows版)详解
2019/09/01 Javascript
Vue通过WebSocket建立长连接的实现代码
2019/11/05 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
python构建基础的爬虫教学
2018/12/23 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
python sorted方法和列表使用解析
2019/11/18 Python
深入了解python列表(LIST)
2020/06/08 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
找到不普通的东西:Bonanza
2016/10/20 全球购物
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
医学生求职自荐信
2013/10/25 职场文书
一个大学生十年的职业规划
2014/01/17 职场文书
咖啡蛋糕店创业计划书
2014/01/28 职场文书
高中军训感言400字
2014/02/24 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
农民工工资发放承诺书
2014/03/31 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
高中综合实践活动总结
2014/07/07 职场文书
购房意向书
2014/08/30 职场文书
团代会闭幕词
2015/01/28 职场文书
公积金贷款承诺书
2015/04/30 职场文书
在职证明书模板
2015/06/15 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL