精华内容
下载资源
问答
  • 主要介绍了python超时重新请求解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 下面是简单的一个重复请求过程,更高级更简单的请移步本博客:https://www.cnblogs.com/fanjp666888/p/9796943.html在爬虫的执行当中,总会遇到请求连接超时的情况,下面的代码块是在请求超时的情况下,捕捉超时错误并...

     下面是简单的一个重复请求过程,更高级更简单的请移步本博客: https://www.cnblogs.com/fanjp666888/p/9796943.html 


    在爬虫的执行当中,总会遇到请求连接超时的情况,下面的代码块是在请求超时的情况下,捕捉超时错误并连续发送多次请求,只到请求连接成功。


    NETWORK_STATUS = True # 判断状态变量
    try:
        response = requests.post(url, headers=self.headers, data=data, timeout=5)
        if response.status_code == 200:
            return response
    except requests.exceptions.Timeout:
        global NETWORK_STATUS
        NETWORK_STATUS = False # 请求超时改变状态

        if NETWORK_STATUS == False:
            '''请求超时'''
            for i in range(1, 10):
                print '请求超时,第%s次重复请求' % i
                response = requests.post(url, headers=self.headers, data=data, timeout=5)
                if response.status_code == 200:
                    return response
    return -1  # 当所有请求都失败,返回  -1  ,此时有极大的可能是网络问题或IP被封。

    转载于:https://www.cnblogs.com/fanjp666888/p/8022282.html

    展开全文
  • python 超时重试方法

    2019-12-19 15:42:10
    在应用中,有时候会 依赖第三方模块执行方法,比如调用某模块的上传下载,数据库查询等操作的时候,如果出现网络问题或其他问题,可能有超时重新请求的情况; 目前的解决方案有 信号量,但不支持window; 多线程...

    在应用中,有时候会 依赖第三方模块执行方法,比如调用某模块的上传下载,数据库查询等操作的时候,如果出现网络问题或其他问题,可能有超时重新请求的情况;

    目前的解决方案有

    1. 信号量,但不支持window;

    2. 多线程,但是 如果是大量的数据重复操作尝试,会出现线程管理混乱,开启上万个线程的问题;

    3. 结合采用 eventlet 和 retrying模块 (eventlet 原理尚需深入研究)

    下面的方法实现:超过指定时间重新尝试某个方法

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    # -*- coding: utf-8 -*-
    import random
    import time
     
    import eventlet
    from retrying import retry
     
    eventlet.monkey_patch()
     
     
    class RetryTimeOutException(Exception):
        def __init__(self, *args, **kwargs):
            pass
     
     
    def retry_if_timeout(exception):
        """Return True if we should retry (in this case when it's an IOError), False otherwise"""
        return isinstance(exception, RetryTimeOutException)
     
     
    def retry_fun(retries=3, timeout_second=2):
        """
        will retry ${retries} times when process time beyond ${timeout_second} ;
        :param retries: The retry times
        :param timeout_second: The max process time
        """
     
        def retry_decor(func):
            @retry(stop_max_attempt_number=retries, retry_on_exception=retry_if_timeout)
            def decor(*args, **kwargs):
                print("In retry method..")
                pass_flag = False
                with eventlet.Timeout(timeout_second, False):
                    r = func(*args, **kwargs)
                    pass_flag = True
                    print("Success after method.")
                if not pass_flag:
                    raise RetryTimeOutException("Time out..")
                print("Exit from retry.")
                return r
     
            return decor
     
        return retry_decor
     
     
    def do_request():
        print("begin request...")
        sleep_time = random.randint(1, 4)
        print("request sleep time: %s." % sleep_time)
        time.sleep(sleep_time)
        print("end request...")
        return True
     
     
    @retry_fun(retries=3)
    def retry_request():
        r = do_request()
        print(r)
     
     
    if __name__ == '__main__':
        retry_request()
    
    展开全文
  • 思路: 1、用户输入账号密码,请求登录...4、访问任意api,检查是否登录/登录是否超时,若未登录或登录超时,则返回“Need Login”信息,用户需要重新登录。 models: user.py class User(db.Model): __tablename__ =

    思路:
    1、用户输入账号密码,请求登录api;
    2、账号不存在,返回“账号不存在”信息;
    3、账号存在,判断登录密码是否相等(加密后的密码),若不相等,返回“密码不正确”信息,若相等,生成用户token(用户令牌),并且设置登录时效性,将token返回给前端设置本地缓存;
    4、访问任意api,检查是否登录/登录是否超时,若未登录或登录超时,则返回“Need Login”信息,用户需要重新登录。

    models:
    user.py

    from flask_demo.app import db
    from sqlalchemy import Column,ForeignKey
    
    class User(db.Model):
        __tablename__ = 'user'
        id = Column(db.Integer, primary_key=True, autoincrement=True) #主键id
        phone = Column(db.String(20), unique=True, nullable=False) #用户手机号
        auth_key = Column(db.String(100), nullable=False)  #加密后的密码
        nick_name = Column(db.String(20)) #用户昵称
        photo = Column(db.String(100)) #用户头像
    

    views:
    user.py

    
    from flask_demo.app.models.user import User
    from flask_demo.app import app,db
    from flask import request
    from flask_demo.utils.login import login_required
    import json
    import hashlib
    import uuid
    
    from flask_demo.utils import cache
    
    @app.route('/login', methods=['GET','POST'])
    def login():
        if request.method == 'POST':
            obj = request.get_json(force=True)
            phone = obj["phone"]
            passwd = obj["password"]
            ls = User.query.filter(User.phone == phone).first()
            if ls :
                auth_key = ls.auth_key #数据库中加密的密码
                password = pwd(passwd) #对用户登录的密码进行加密
                if auth_key != password:
                    return json.dumps({"code": 200, "msg": "密码错误,请重新输入"}, indent=4, sort_keys=True, default=str,ensure_ascii=False)
                else:
                    #登录成功,使用uuid4生成token
                    token = uuid.uuid4().hex
                    cache.savc_token(phone,token,20) #这边设置20s的登录超时时间
    
                    return json.dumps({"code": 200, "msg": "登录成功","token":token}, indent=4, sort_keys=True, default=str, ensure_ascii=False)
            else:
                return json.dumps({"code": 200, "msg": "账号不存在"}, indent=4, sort_keys=True, default=str, ensure_ascii=False)
    
    @app.route('/test_msg', methods=['GET'])
    @login_required #登录装饰器
    def test_msg():
        ls = User.query.all()
        res = []
        for x in ls:
            temp = x.__dict__
            del temp['_sa_instance_state']
            res.append(temp)
    
        return json.dumps({"code": 200, "data": res}, indent=4, sort_keys=True, default=str, ensure_ascii=False)
    
    #将明文的txt转成MD5密文格式
    def pwd(txt):
        md5_ = hashlib.md5()
        md5_.update(txt.encode('utf-8'))
        md5_.update('@zjw@666#$*%'.encode('utf-8'))
        return md5_.hexdigest()
    
    

    utils公用组件:
    cache.py,通过redis进行登录缓存,并设置登录时效性

    import redis
    rdb = redis.Redis(host='localhost',port=6379,db=0)
    
    def savc_token(userid,token ,expires):
    
        rdb.set(userid,token,ex=expires)
    
    def get_userid(token):
        return rdb.get(token)
    
    

    check_login.py
    视图装饰器
    Python 有一个非常有趣的功能:函数装饰器。这个功能可以使网络应用干净整洁。 Flask 中的每个视图都是一个装饰器,它可以被注入额外的功能。你可能已经用过了 route() 装饰器。但是,你有可能需要使用你自己的装饰器。 假设有一个视图,只有已经登录的用户才能使用。如果用户访问时没有登录,则会被 重定向到登录页面。这种情况下就是使用装饰器的绝佳机会。

    检查登录装饰器
    让我们来实现这个装饰器。装饰器是一个包装并替换另一个函数的函数。既然源函数 已经被替代,就需要记住:要复制源函数的信息到新函数中。可以用 functools.wraps() 处理这个事情。

    from functools import wraps
    from flask import request
    from flask_demo.utils import rdb
    import json
    
    #检查登录
    def login_required(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            token = request.headers.get('token')
            user = request.headers.get('user')
            print(token,user)
            if (token is None) or (not rdb.get(user)) or (token!=rdb.get(user).decode('utf-8')):
                return json.dumps({'status': 1, 'msg': 'Need Login !'}), 401
            return f(*args, **kwargs)
        return decorated_function
    

    测试结果

    用户账号不存在:
    在这里插入图片描述
    用户密码错误:
    在这里插入图片描述
    用户账号密码正确,登录成功,返回token:在这里插入图片描述
    访问其他api,输入错误的token:
    在这里插入图片描述
    访问其他api,输入正确的token,返回数据:
    在这里插入图片描述
    登录超时,访问其他api:在这里插入图片描述

    展开全文
  • 我们都知道 scrapy 可以设置代理 IP,但是不知道大家有没有遇到...那么怎么才能让它请求超时的时候,再使用代理 IP 进行重新请求呢? 很容易就想到下载中间件,DowmloaderMiddleware 一个介于 request, response 中..

    我们都知道 scrapy 可以设置代理 IP,但是不知道大家有没有遇到这样一个场景:

    常规的代理 IP 设置,会对每个请求都生效,也就是说每个请求都会去使用代理

    但是有些请求根本不需要代理,我希望当我的请求出现错误或超时的时候再去设置代理 IP

    这样既节省了资源,又缩短了请求的时间,毕竟有些代理质量真的一言难尽

    那么怎么才能让它请求超时的时候,再使用代理 IP 进行重新请求呢?

    很容易就想到下载中间件,DowmloaderMiddleware

    一个介于 request, response 中间的钩子,用于修改 request 和处理 response

    首先我们需要捕获超时等异常的请求,在下载中间件中添加如下代码:

    from twisted.internet.error import TCPTimedOutError, TimeoutError
    
    def process_exception(self, request, exception, spider):
            if isinstance(exception, TimeoutError):
                self.process_request_back(request, spider)  # 连接超时才启用代理ip机制
                return request
    
            elif isinstance(exception, TCPTimedOutError):
                self.process_request_back(request, spider)
                return request
    复制代码

    以上代码的作用就是捕获异常请求,同时调用设置代理 IP 的函数,并返回该请求

    下面的设置 IP 的代码

    def process_request_back(self, request, spider):
            request.meta["proxy"] = xun.proxy
            request.headers["Proxy-Authorization"] = xun.headers
    复制代码

    注意不能使用 process_request() 方法, 如果代理添加在该方法下,就是上文所说的常规的设置代理 IP 方法

    同时对于 scrapy 出现 TimeoutError,TCPTimedOutError 等异常的时候,还可以通过以下几种方案来解决:

    主要通过设置文件来更改

    1、降低同时请求的数量

    CONCURRENT_REQUESTS = 5
    复制代码

    2、 增加超时时间

    DOWNLOAD_TIMEOUT = 300
    复制代码

    3、 增加异常重试次数

    RETRY_TIMES = 5
    复制代码

    第四种就是开头所讲的,在请求超时后再添加代理 IP

    你学废了吗?

    最后多说一句,想学习Python可联系小编,这里有我自己整理的整套python学习资料和路线,想要这些资料的都可以进q裙609616831领取。

    本文章素材来源于网络,如有侵权请联系删除。

    展开全文
  • python爬虫(数据下载)目录下载网页——直接下载下载网页——超时重新下载设置请求头链接爬虫下载限速爬虫陷阱设置代理 目录 编写python爬虫,可以使用urllib或requests模块,参考资料如下: requests文档 urllib...
  • python3 爬取百度图片

    2019-06-05 11:10:59
    ''' 设置变量 < imgoutpath > 为文件保存路径 控制 初始化函数 成员变量 < i > 完成每次爬取的步长 ... 设置超时时间为 5s 如果5s 请求超时 则跳过本请求继续请求一个 ''' __author__ = 'Admi...
  • 进入网页版微信,扫描二维码后,页面会向服务器发送1个Ajax请求(,然后在手机APP上会被要求确认登录),确认后手机会向服务器发送1个状态,...该请求最多持续1分钟,超时则断开,然后重新发送请求.这种请求方式称为长轮询 ...
  • python3.6.3递归爬取国家统计局地区数据存入mysql,可以自定义爬取省市区县乡镇社区5级 ...get_level爬取到哪一级的数据 1省,2市,3区县,4,乡镇,5村,社区 请求超时,异常,可自动重新请求爬取数据
  • haproxy 超时机制

    2018-06-12 09:52:00
    pre name="code" class="python">option redispatch option redispatch 是否允许重新分配在session 失败后 option abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求 ...
  • python3.6.3递归爬取国家统计局地区数据存入mysql,可以自定义爬取省市区县乡镇社区5级 数据来源:...4,乡镇,5村,社区 请求超时,异常,可自动重新请求爬取数据
  • [894]python的重试机制

    2020-09-01 20:18:48
    比如在发送请求时,会因为网络不稳定,往往会有请求超时的问题。 这种情况下,我们通常会在代码中加入重试的代码。重试的代码本身不难实现,但如何写得优雅、易用,是我们要考虑的问题。 这里要给大家介绍的是一个第...
  • 只要进程正在运行并保持状态(例如,系统进程,脚本,长期存在的容器或不“超时”的lambda函数),承载令牌就会定期自动刷新,或者在到期时自动刷新(如果常规刷新不成功)。 注意:从电子邮件登录获取的令牌最多...
  • 最近把基础部分的内容重新创建了一个名为“Python-Core-50-Courses”的项目,用更为简单通俗的方式重写了这部分内容并附带了视频讲解,初学者可以关注下这个新项目。国内用户如果访问GitHub比较慢的话,也可以关注我...
  • 企业微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。如果企业在调试中,发现成员无法收到被动回复的消息,可以检查是否消息处理超时。 ”“” 这里就是原因,我的程序里面接收消息...
  • 配置accessibility服务的最大空闲时间,超时将自动释放。默认3分钟。 d.set_new_command_timeout(300) # change to 5 minutes, unit seconds Debug HTTP requests Trace ...
  • 装饰器(一)

    2020-05-17 23:01:07
    练习,不断练习 #!/usr/bin/python3 # -*- coding: UTF-8 -*- """ @File:study.py ...# 如果请求网络超时,或者连接超时,可以重新发送请求,如果重试三次之后,还是超时,抛出对应的异常 # # def request_http
  • 由于pyresttest进行默认时区为GMT,在一些服务要求时间间隔不超过一定时间的服务,通过pyresttest进行测试会出现请求超时重新登陆的情况。 根据进行调整原有进行:...
  • 先是安装ptcryptodome各种失败,各种请求超时,看到提示说pip版本低,于是又开始了pip的升级之路。 本以为pip升级很容易,按照提示命令操作即可,但是遇到的问题是已经提示升级成功为最新版本,但是在使用pip -V...
  • RawSockets-源码

    2021-03-28 14:24:58
    RawSockets ==========================================方法: 采取的主要方法是在三个层上工作-IP,TCP和应用程序层。... ./rawhttpget:启动程序的shell脚本./main.py:实现主TCP协议的python脚本./
  • 无法完成登陆

    2021-01-09 15:02:44
    [2017-07-07 11:37:38] [ERROR] 第20次请求“http://s.web2.qq.com/api/getvfwebqq”时出现 超时, html='\r\n</p><title...\r\n\r\n\r\n' Traceback (most recent call last): File "get_qq_...
  • 如果需要直接发起 post请求,可以删除 start_urls 中的元素,重新 start_requests 方法。 解析response 采用了scrapy中的解析库parse,解析方法和scrapy一样,支持xpath,css选择器,re。 简单示例: xpath("//div...
  • 所以我们的目标就是通过Python来爬取腾讯新闻网实时疫情数据,其原理主要是通过Requests获取Json请求,从而得到各省、各市的疫情数据。 4.1.1分析网址 ​ 访问腾讯疫情实时分析平台...
  • 10、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务; 11、任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的...
  • 普遍使用的 Android APP 技术架构,往往是在一个界面中存在大量的业务逻辑,而业务逻辑中充斥着各种网络请求、数据操作等行为,整个项目中也没有模块的概念,只有简单的以业务逻辑划分的文件夹,并且业务之间也是...
  • 10、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务; 11、任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的...
  • 10、任务超时控制:支持自定义任务超时时间,任务运行超时将会主动中断任务; 11、任务失败重试:支持自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;其中分片任务支持分片粒度的...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

python超时重新请求

python 订阅