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定时检查启动某个exe程序适合检测exe是否挂了
Jan 21 Python
Python制作简单的网页爬虫
Nov 22 Python
利用Python批量生成任意尺寸的图片
Aug 29 Python
Python实现爬取需要登录的网站完整示例
Aug 19 Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 Python
python嵌套字典比较值与取值的实现示例
Nov 03 Python
Django REST为文件属性输出完整URL的方法
Dec 18 Python
python绘制立方体的方法
Jul 02 Python
Python模拟简单电梯调度算法示例
Aug 20 Python
Python JSON格式数据的提取和保存的实现
Mar 22 Python
Python多线程threading模块用法实例分析
May 22 Python
python import 上级目录的导入
Nov 03 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
杏林同学录(七)
2006/10/09 PHP
利用PHP实现与ASP Banner组件相似的类
2006/10/09 PHP
用PHP伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
php实现中文转数字
2016/02/18 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
Javascript String.replace的妙用
2009/09/08 Javascript
js 利用className得到对象的实现代码
2011/11/15 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
2013/08/09 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
JavaScript获取客户端计算机硬件及系统等信息的方法
2014/01/02 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
关于javascript中dataset的问题小结
2015/11/16 Javascript
jquery 中toggle的2种用法详解(推荐)
2016/09/02 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
2017/03/04 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
vue2导航根据路由传值,而改变导航内容的实例
2017/11/10 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
微信小程序如何自定义table组件
2019/06/29 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
Python解析xml中dom元素的方法
2015/03/12 Python
在MAC上搭建python数据分析开发环境
2016/01/26 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
tensorflow获取变量维度信息
2018/03/10 Python
Python带动态参数功能的sqlite工具类
2018/05/26 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
python实现转圈打印矩阵
2019/03/02 Python
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
当当网软件测试笔试题
2015/11/24 面试题
王力宏牛津大学演讲稿
2014/05/22 职场文书
党员干部廉政承诺书
2015/04/28 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
四年级作文之说明文作文
2019/10/14 职场文书