精华内容
下载资源
问答
  •  爬虫这类型程序典型特征是意外多,无法确保每次请求都是稳定的返回统一的结果,要提高健壮性,能对错误数据or超时or程序死锁等都能进行处理,才能...二:普通请求函数的超时处理 三:selenium+chrome | phantomjs
    

    爬虫这类型程序典型特征是意外多,无法确保每次请求都是稳定的返回统一的结果,要提高健壮性,能对错误数据or超时or程序死锁等都能进行处理,才能确保程序几个月不停止。本项目乃长期维护github:反反爬虫开源库中积累下来,更多干货欢迎star。

    目录:

    • 一:基础try&except异常处理
    • 二:普通请求函数的超时处理
    • 三:selenium+chrome  | phantomjs 的超时处理
    • 四:自定义函数的死锁or超时处理
    • 五:自定义线程的死锁or超时处理
    • 六:自重启的程序设计

    一:基础try&except异常处理

    try&except的语句作用不仅仅是要让其捕获异常更重要的是让其忽略异常,因为爬虫中的绝大多数异常可能重新请求就不存在,因此,发现异常的时候将其任务队列进行修复其实是个最省力的好办法。

    其次被try包住的语句即使出错也不会导致整个程序的退出,相信我,你绝对不希望计划跑一个周末的程序在半夜停止了。

     
     
     
     
     
    Python
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     try:
        passhttp://top.jobbole.com/deliver-article/#
        #可能出错的语句
    except Exception,e:
        pass
        #保留错误的url,留待下次重跑
        print e
    finally:
        #无论是否处理了异常都继续运行
        print time.ctime()

     

    二:请求函数的超时处理

    2.1:普通请求:

    2.1.1单请求类型:

     
     
     
     
     
    Python
     
    1
    2
    import requests
    requests.get(url,timeout=60)

     

    2.1.2会话保持类型:

     

     
     
     
     
     
    Python
     
    1
    2
    3
    import requesocks
    session = requesocks.session()
    response = session.get(URL,headers=headers,timeout=10)

     

    三:selenium+chrome  | phantomjs 的超时处理

    2.2.1:selenium+chrome的超时设置

    官网原文:http://selenium-python.readthedocs.io/waits.html

    显式等待:、等待某个条件发生,然后再继续进行代码。

     
     
     
     
     
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
     
    driver = webdriver.Firefox()
    driver.get("http://somedomain/url_that_delays_loading")
    try:
        element = WebDriverWait(driver, 10).until(  #这里修改时间
            EC.presence_of_element_located((By.ID, "myDynamicElement"))
        )
    finally:
        driver.quit()

    隐式等待:是告诉WebDriver在尝试查找一个或多个元素(如果它们不是立即可用的)时轮询DOM一定时间。默认设置为0,一旦设置,将为WebDriver对象实例的生命期设置隐式等待。

     
     
     
     
     
     
    1
    2
    3
    4
    5
    6
    from selenium import webdriver
     
    driver = webdriver.Firefox()
    driver.implicitly_wait(10) # seconds
    driver.get("http://somedomain/url_that_delays_loading")
    myDynamicElement = driver.find_element_by_id("myDynamicElement")

     

    2.2.2:phantomjs的超时设置

    这里使用不带selenium的phantomjs,需要使用js。主要设置语句是

     
     
     
     
     
    JavaScript
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    page.settings.resourceTimeout = 5000; // 等待5秒
     
    var system = require('system');
    var args = system.args;
    var url = args[1];
    var page = require('webpage').create();
    page.settings.resourceTimeout = 5000; // 等待5秒
    page.onResourceTimeout = function(e) {
    console.log(e.errorCode);   //打印错误码
    console.log(e.errorString);//打印错误语句
    console.log(e.url);     //打印错误url
    phantom.exit(1);
    };
    page.open(url, function(status) {
    if(status==='success'){
    var html=page.evaluate(function(){
    returndocument.documentElement.outerHTML;
    });
    console.log(html);
    }
    phantom.exit();
    });
    //$phantomjs xx.js http://bbs.pcbaby.com.cn/topic-2149414.html

     

    四:自定义函数的死锁or超时处理

    这个非常重要!!

    python是顺序执行的,但是如果下一句话可能导致死锁(比如一个while(1))那么如何强制让他超时呢?他本身如果没有带有超时设置的话,就要自己运行信号(import signal)来处理

     
     
     
     
     
    Python
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #coding:utf-8
    import time
    import signal
     
    def test(i):
        time.sleep(0.999)#模拟超时的情况
        print "%d within time"%(i)
        return i
     
    def fuc_time(time_out):
        # 此为函数超时控制,替换下面的test函数为可能出现未知错误死锁的函数
        def handler(signum, frame):
            raise AssertionError
        try:
            signal.signal(signal.SIGALRM, handler)
            signal.alarm(time_out)#time_out为超时时间
            temp = test(1) #函数设置部分,如果未超时则正常返回数据,
            return temp
        except AssertionError:
            print "%d timeout"%(i)# 超时则报错
     
    if __name__ == '__main__':
        for i in range(1,10):
            fuc_time(1)

     

     

    五:自定义线程的死锁or超时处理

    在某个程序中一方面不适合使用selenium+phantomjs的方式(要实现的功能比较难不适合)因为只能用原生的phantomjs,但是这个问题他本身在极端情况下也有可能停止(在超时设置之前因为某些错误)

    那么最佳方案就是用python单独开一个线程(进程)调用原生phantomjs,然后对这个线程进程进行超时控制。

    这里用ping这个命令先做测试,

     
     
     
     
     
    Python
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import subprocess
    from threading import Timer
    import time
     
    kill = lambda process: process.kill()
     
    cmd = ["ping", "www.google.com"]
    ping = subprocess.Popen(
        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     
    my_timer = Timer(5, kill, [ping])#这里设定时间,和命令
    try:
        my_timer.start()#启用
        stdout, stderr = ping.communicate()#获得输出
        #print stderr
        print time.ctime()
    finally:
        print time.ctime()
        my_timer.cancel()

     

    六:自重启的程序设计

    比如程序在某种情况下报错多次,,那么满足条件后,让其重启即可解决大多数问题,当然这只不过是治标不治本而已,如果这个程序重启没有大问题(例如读队列类型)那么自重启这是最省力的方式之一。

     
     
     
     
     
    Python
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import time
    import sys
    import os
    def restart_program():
      python = sys.executable
      os.execl(python, python, * sys.argv)
      
    if __name__ == "__main__":
      print 'start...'
      print u"3秒后,程序将结束...".encode("utf8")
      time.sleep(3)
      restart_program()
    展开全文
  • 可以使用except: 捕获任何异常,包括SystemExit KeyboardInterupt,不过这样不便于程序的调试使用 最简单的情况是捕获urllib2.URLError try: urllib2.urlopen("http://example.com", timeout = 1) ...

    可以使用 except: 捕获任何异常,包括 SystemExit 和 KeyboardInterupt,不过这样不便于程序的调试和使用

    最简单的情况是捕获 urllib2.URLError

    try:  
        urllib2.urlopen("http://example.com", timeout = 1)  
    except urllib2.URLError, e:  
        raise MyException("There was an error: %r" % e)  

    以下代码对超时异常进行了捕获

    import urllib2  
    import socket  
          
    class MyException(Exception):  
            pass  
          
    try:  
        urllib2.urlopen("http://example.com", timeout = 1)  
    except urllib2.URLError, e:  
        if isinstance(e.reason, socket.timeout):  
            raise MyException("There was an error: %r" % e)  
        else:  
            # reraise the original error  
            raise

     

    转载于:https://www.cnblogs.com/mmix2009/p/3231265.html

    展开全文
  • 上一篇博文写了我的naocs sdk,但啥都有了,那微服务关键的熔断限流的功能也必须安排上 我的git地址:https://github.com/KcangYan/nacos-python-sdk 熔断器 在自己的项目中使用 pip install KcangFuse #安装 ...

    基于函数的 熔断器,限流器

    上一篇博文写了我的naocs sdk,但啥都有了,那微服务关键的熔断和限流的功能也必须安排上。虽然说是微服务的熔断器和限流器,但是你只要导入并创建好对应的熔断器和限流器,你可以用在函数上面,替你处理函数超时响应以及函数异常。也可以对你的函数做限流和熔断。
    我的git地址:https://github.com/KcangYan/nacos-python-sdk

    熔断器

    在自己的项目中使用

      pip install KcangFuse #安装
    
      import KcangFuse.funcFuse as funcFuse
    

    使用说明:

      def myFallBackFunc(*args,**kwargs):#自定义熔断返回函数
          return "function fallback " + "  function info: " + str(args)+ " " + str(kwargs)
    
      def myTimeoutFallbackFunc(ex, *args,**kwargs): #自定义错误返回函数
          print(ex)
          return "function time out " + "  function info: " + str(args)+ " " + str(kwargs)
    
      def myExceptFallbackFunc(ex, *args,**kwargs): #自定义超时返回函数
          return "function except " + str(ex) + "  function info: " + str(args)+ " " + str(kwargs)
    

    当开启熔断时,即返回自定义熔断返回函数,不开启根据情况返回其他两个

      SimpleFuncFuse1 = funcFuse.funcFuse()#不设置则使用内置默认错误返回函数
      
      注意:注解需声明在函数上方,不可以在@app这个注解上方,否则不生效!
      
      @app.route(Router + "/test1", methods=['GET'])
      @SimpleFuncFuse1.fuse(timeout=2)
      def fuseTest1():#超时返回自定义超时错误返回函数
          time.sleep(3)
          return "ok"
    
     SimpleFuncFuse2 = funcFuse.funcFuse(timeoutFallbackFunc=myTimeoutFallbackFunc,
                                         exceptFallbackFunc=myExceptFallbackFunc)
      可以尝试让路由映射的函数发生异常,熔断器会将详细的函数信息返回给自定义异常返回函数,交由你自己处理                                   
      @app.route(Router + "/test2/<int:x>/<int:y>", methods=['GET'])
      @SimpleFuncFuse2.fuse()
      def fuseTest2(x,y):
          z = x/y #路由中输入0尝试错误返回自定义函数
          return str(z)
    

    fuseStatus=True时则表示开启熔断器模式(默认是关闭的)
    exceptPercent=0.5, 0-1之间 异常比例,即在熔断统计时间窗口期内发生异常的比例
    timeWindows=5, 单位:秒 熔断时间窗口期,即触发熔断后熔断多久,熔断时间窗口期过去后,会自动再放开请求进去,
    如果异常比例还是很高的话,则继续熔断。
    timeCount=2, 单位:秒 熔断统计异常时间窗口期,即统计异常的时间段长度。建议1-2秒

      SimpleFuncFuse3 = funcFuse.funcFuse(fallbackFunc=myFallBackFunc)
      @app.route(Router + "/test3", methods=['GET'])
      @SimpleFuncFuse3.fuse(timeout=2,fuseStatus=True,exceptPercent=0.5,timeWindows=5,timeCount=2)
      def fuseTest3(): #超时熔断
          time.sleep(3)
          return "ok"
    
      @app.route(Router + "/test4/<int:x>/<int:y>", methods=['GET'])
      @SimpleFuncFuse3.fuse(fuseStatus=True, exceptPercent=0.5,timeWindows=5,timeCount=2)
      def fuseTest4(x, y):
          z = x / y  # 路由中输入0尝试错误熔断
          return str(z)
    

    限流器

    在自己的项目中使用

      pip install KcangFuse
    
      import KcangFuse.funcFuse as funcFuse
    

    建立限流器类,并赋予自定义的限流返回函数

     flowControl = funcFuse.funcFlowControl(fallBackFunc=myFallBackFunc)
    

    timeWindows=2, 单位秒 限流时间窗口期
    maxCount=5 允许请求数 即 在限流时间窗口期内 最多允许5个请求在处理,可以理解为最多五个线程

    可以和熔断器注解一起使用!

      @app.route(Router + "/test5", methods=['GET'])
      @SimpleFuncFuse3.fuse(timeout=2)
      @flowControl.flowControl(timeWindows=2,maxCount=5)
      def fuseTest5(): #尝试这个demo 即可
          time.sleep(3)
          return "ok"
    

    可以尝试一下下面这个demo调用上面这个接口,看看效果

      def t5(count):
          re = requests.get("http://127.0.0.1:8080/fuse/test5")
          print(re.text + " 当前线程:"+str(count)+"\n")
    
      if __name__ == '__main__':
         import requests,threading
         for i in range(0,200):
             threading.Thread(target=t5,args=(i,)).start()
         time.sleep(5)
    

    结尾

    后续如果有什么问题,我会第一时间更新在github上,只要pip install更新版本即可

    展开全文
  • python添加命令行参数和异常处理

    千次阅读 2015-04-25 21:09:50
    异常处理+命令行解析库argparse Socket.error 与一般I/O通信问题有关的 ...Socket.timeout 与一个socket上调用settimeout()后,超时处理有关 #-*- coding:utf-8 -*- import sys import socket


    异常处理+命令行解析库argparse


    Socket.error 与一般I/O和通信问题有关的

    Socket.gaierror 与查询地址有关的

    Socket.herror 与其他地址错误有关

    Socket.timeout 与一个socket上调用settimeout()后,超时处理有关

    #-*- coding:utf-8 -*-
    import sys
    import socket
    import argparse
    #通过命令行输入参数 python 1_7_socket_errors.py --host=www.python.org --port=8080 --file=1_7_socket_errors.py
    #也可直接指定host和port,运行。
    def main():
        #创建一个解析器
        parser = argparse.ArgumentParser(description = "Socket Error")
        #添加参数选项
        parser.add_argument('--host',action="store",dest="host",required=False)
        parser.add_argument('--port',action="store",dest="port",required=False,type=int)
        parser.add_argument('--file',action="store",dest="file",required=False)
        #调用parse_args()方法进行解析
        given_args = parser.parse_args()
        host = given_args.host
        port = given_args.port
        #也可以自己指定port,host
        #host = "www.python.org"
        #port = 80
    
        filename = given_args.file
        #处理创建套接字异常
        try:
            s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        except socket.error,e:
            print "Error creating socket:%s"%e
            sys.exit(1)
        #处理连接套接字异常
        try:
            s.connect((host,port))
        except socket.gaierror,e:
            print"Address-related error connecting to server:%s"%e
            sys.exit(1)
        except socket.error,e:
            print"Connection error:%s"%e
            sys.exit()
    
        #处理发送数据错误
        try:
            #GET方法 发送到网网站
            s.sendall("GET %s HTTP/1.0\r\n\r\n"%filename)
        except socket.error,e:
            print"Error sending data:%s"%e
            sys.exit(1)
    
        while 1:
            try:
                #接受网站给返回的数据
                buf = s.recv(2048)
            except socket.error,e:
                print"Error receiving data:%s"%e
                sys.exit(1)
            if not len(buf):
                break
            #将buf数据发送到命令行中
            sys.stdout.write(buf)
    
    if __name__ == "__main__":
        main()
            
    


    展开全文
  • Python异常与程序调试

    2021-04-09 19:07:29
    1、异常是什么 问题错误、网络错误、系统错误 ...Python异常处理语法 try: 程序执行语句块 except Exception as alias: 异常处理语句块 … else: 无异常处理语句块 finally: 必须的处理语句块 ...
  • 网址: 【数据挖掘】2019年最新python3 数据分析与爬虫实战_哔哩哔哩 (゜-゜)つロ 干杯~-...第一周 python基础知识(4课时) 第二周 爬虫 第三周 数据分析与挖掘技术 第一周——第一课 001课程介绍 002初始...
  • 一、urllib库基本使用。 1.1、url库他是python内置的HTTP请求库,他主要包含4个模块。 1.2、第一个简单的get请求。 1.3、如何判断是get请求post请求。 1.4、post请求表单的提交。...三、urllib库异常处理
  • 异常 python的socket模块实际上定义了4种可能出现的异常: 1)与一般I/O 通信问题有关的socket.error;...4)与在一个socket上调用settimeout()后,处理超时有关的socket.timeout; import socket, sys...
  • 这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理异常-或者是可选的超时发生。 setDaemon,将该线程标记为守护线程或用户线程 1、join ()方法:主线程A中,创建了子线程B,并且在主线程...
  • 但是如果我们在某个线程中需要二次或多次获得同一个锁,这个分布式锁就会出现死锁,一直等待第一个加锁逻辑结束后才能继续进行,并且会直接导致当前的业务逻辑的异常和超时。因此还需要实现一种分布式可重入锁,来...
  • Selenium是一个自动化测试工具,...代码只是个简单的练习,对于异常情况没有过多的处理,也没有代理、登录、验证什么的,只是能用(或许网络不好的话需要把超时和睡眠时间加长一点点)。另外,对于数据的解析我也...
  • 高效的RPC命令调用框架 特点: 基于优秀的zerorpcgevent框架 支持心跳检测、命令调用超时和rpc调用超时 完善的异常处理机制 底层命令支持管道,同时支持多种命令调用方式
  • 需要加入QQ交流群的可以扫描下面的二维码,交流群会为大家提供学习资源问题解答,还会持续为大家带来免费的线上Python体验课行业公开课,敬请关注。 Python应用领域职业发展分析 简单的说,Python是一个...
  • 精通python网络爬虫笔记一

    千次阅读 2017-10-20 16:28:57
    urllib使用 1 一个简单的例子 2 保存在文件中并查看部分信息 4 User-Agent 模拟Header ...65 异常处理 7 总结 71 URL域名 72 urllib及常用的函数总结 1. urllib使用1.1 一个简单的例子入门例子html源
  • Python实现聊天室全双工通信

    千次阅读 2019-04-23 22:31:35
    学校的作业,用TCPSocket实现聊天室,课程中的只是简单的一对一对话,网上有用IO多路复用...遇到的问题是recv阻塞问题,解决方法是设置客户端连接超时,无消息则捕获timeout异常并pass,继续处理其他连接的缓冲区。...
  • 数据丢失和超时 TFTP(Trivial File Transfer Protocol,简单文件传输协议)是UDP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为69,基于RFC1350...
  • [INFO] download article body: java之异常分类及处理 [INFO] download article body: 开发工具之arthas命令 [INFO] download article body: 使用Builder设计模式,设计ToolBar [INFO] download article body:...
  • MySQL MTOP v2.1.zip

    2019-07-07 07:58:18
    并能在数据库偏离设定的正常运行阀值(如连接异常,复制异常,复制延迟) 时发送告警邮件通知到DBA进行处理。并对历史数据归档,通过图表展示出数据库近期状态,以便DBA开发人员能对遇到的问题进行分析诊断。   ...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

python异常和超时处理

python 订阅