requests-代理设置,超时设置,登陆验证,Prepared Requests

发布时间:2019-05-03 11:05:00编辑:Run阅读(5765)

    对于某些网站,大规模频繁请求,网站可能会弹出验证码,或者跳转到登陆认证页面,甚至可能会被直接封客户端ip,导致短时间内无法访问,这个时候就需要用到代理ip。

    requests是能解决这个问题的,需要用到proxies参数,示例如下:

    import requests
    
    proxies = {
        "http": 'http://123.123.123.10:5566',
        "https": 'https://123.123.123.10:443',
    }
    
    requests.get("https://www.baidu.com", proxies=proxies)

    上面代理地址换成有效代理地址即可



    验证代理配置

    import requests
    
    proxies = {
        "http": 'http://user:password@123.123.123.10:5566/',
    }
    
    requests.get("https://www.baidu.com", proxies=proxies)



    requests还支持socks协议的代理

    需要安装socks这个库

    pip3 install 'requests[socks]'


    示例代码:

    import requests
    
    proxies = {
        "http": 'socks5://user:password@123.123.123.10:5566/',
        "https": 'socks5://user:password@123.123.123.10:5566/',
    }
    
    requests.get("https://www.baidu.com", proxies=proxies)



    requests超时设置

    在本机网络状况不好或服务器网络响应太慢甚至无法响应的时候,应该设置一个超时时间,需要用到timeout参数。

    将超时时间设置为0.1秒,如果0.1秒内没有响应,就会抛出异常。

    import requests
    r = requests.get('https://www.alibaba.com', timeout=0.1)
    print(r.status_code)

    返回信息:

    requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='www.alibaba.com', port=443): Read timed out. (read timeout=0.1)


    实际上,请求分为两个阶段,即连接(connect)和读取(read)。设置的timeout将作用于连接和读取这两个的timeout总和,也可以分别指定,传入一个元组:

    import requests
    r = requests.get('https://www.alibaba.com', timeout=(1, 1))
    print(r.status_code)


    如果想永久等待,可以将timeout设置为None,或者不设置直接留空,默认为None,如果服务器响应很慢,就慢慢等待,不会返回超时错误,用法如下:

    import requests
    r = requests.get('https://www.alibaba.com', timeout=None)
    print(r.status_code)
    
    r1 = requests.get('https://www.alibaba.com')
    print(r1.status_code)



    requests登陆验证(身份认证)

    在访问网站时,可能会遇到认证页面,此时可以使用requests自带的身份认证功能,示例:

    import requests
    from requests.auth import HTTPBasicAuth
    r = requests.get('http://localhost:5000', auth=HTTPBasicAuth('username', 'password'))
    print(r.status_code)
    
    # 默认使用HTTPBasicAuth这个类来认证
    r1 = requests.get('http://localhost:5000', auth=('username', 'password'))
    print(r1.status_code)


    此外,requests还提供了其他认证方式,OAuth认证,此时需要安装oauth包

    pip3 install requests_oauthlib

    示例代码:

    import requests
    from requests_oauthlib import OAuth1
    
    url = 'https://api.twitter.com/1.1/account/verify_credentials.json'
    auth = OAuth1('your_app_key', 'your_app_secret', 'your_oauth_token', 'user_oauth_token_secret')
    requests.get(url, auth=auth)



    Prepared Requests

    可以将请求表示为数据结构,其中各个参数都可以通过一个Request对象来表示,这个数据结构就叫Prepared Requests。

    示例:

    from requests import Request, Session
    
    url = 'http://httpbin.org/post'
    data = {
        'name': 'zhangsan',
        'age': '22',
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    }
    s = Session()
    req = Request('POST', url=url, data=data, headers=headers)
    prepped = s.prepare_request(req)
    r = s.send(prepped)
    print(r.text)

    返回信息:

    image.png

    引入了Request,用url,data,headers参数构造了一个Request对象,需要再调用Seesion的prepare_request()方法将其转换为一个Prepared Requests对象,然后用send()方法发送即可,可以看到同样达到了POST请求效果。

    有了Request这个对象,就可以将请求当作独立的对象来看待,这样在进行队列调度时会非常方便。

关键字