• requests库的基础使用


    1.requests简介

    Requests是一个优雅而简单的Python HTTP库,专为人类而构建,requests的使用方式非常的简单、直观、人性化,让程序员的精力完全从库的使用中解放出来。

    Requests的官方文档同样也非常的完善详尽,而且少见的有中文官方文档:http://cn.python-requests.org/zh_CN/latest/。 英文文档:http://docs.python-requests.org/en/master/api/

    首先打开requests库的源码

    def request(self, method, url,
                params=None, data=None, headers=None, cookies=None, files=None,
                auth=None, timeout=None, allow_redirects=True, proxies=None,
                hooks=None, stream=None, verify=None, cert=None, json=None)

    Requests的请求不再像urllib一样需要去构造各种Request、opener和handler,使用Requests构造的方法,并在其中传入需要的参数即可。每一个请求方法都有一个对应的API,比如GET请求就可以使用get()方法,而其他的请求类型,都有各自对应的方法:

    import requests
    
    req1 = requests.get("https://www.baidu.com")
    req2 = requests.post("https://www.baidu.com")
    req3 = requests.put("https://www.baidu.com")
    req4 = requests.delete("https://www.baidu.com")

    2.发送请求和传入参数

    我们可以直接往传入headers,我们以简书网为例:

    # 自定义headers
    headers = {
        "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
    }
    # 自定义cookies
    cookies = {
        "cookie": "sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2216e2b34f5c5357-040290e0015209-7373e61-1049088-16e2b34f5c6470%22%2C%22%24device_id%22%3A%2216e2b34f5c5357-040290e0015209-7373e61-1049088-16e2b34f5c6470%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%7D; __yadk_uid=Xtd0BZTUL8a4fZOfayVfSgHUbAlRlIyC; signin_redirect=https%3A%2F%2Fwww.jianshu.com%2F; read_mode=day; default_font=font2; locale=zh-CN; Hm_lvt_0c0e9d9b1e7d617b3e6842e85b9fb068=1572683291,1572878893,1572910084,1573038354; Hm_lpvt_0c0e9d9b1e7d617b3e6842e85b9fb068=1573038354"
    }
    
    # 对简书网发送请求
    req = requests.get("https://www.jianshu.com", headers=headers, cookies=cookies)

    在网络请求中,我们常常会遇到状态码是3开头的重定向问题,在Requests中是默认开启允许重定向的,即遇到重定向时,会自动继续访问。

    req = requests.get("https://www.jianshu.com", headers=headers, cookies=cookies,allow_director=False)

    当我们需要使用代理时,同样构造代理字典,传递给proxies参数,自定义proxies参数,porxies = {"http":"id:port"}

    3.接受响应

    通过Requests发起请求获取到的是request对象,我们可以通过text直接读取到字符串格式的响应内容,或用content获取原始的二进制数据。Requests会自动的根据响应的报头来猜测网页的编码是什么,然后根据猜测的编码来解码网页内容,基本上大部分的网页都能够正确的被解码。而如果发现text解码不正确的时候,就需要我们自己手动的去指定解码的编码格式。如下:

    import requests

    # 对简书网发送请求 req = requests.get("https://www.jianshu.com", headers=headers, cookies=cookies) # text读取内容 req.encoding = "utf-8" res = req.text print(res)

    或者用content方法获取二进制数据

    # content读取响应内容
    res = req.content.decode()
    print(res)

    除了查看响应内容之外,我们还可以单独地查看请求头中的headers,encoding,url,status code等

    res_code = req.status_code
    res_encoding = req.encoding
    res_header = req.headers["Connection"]
    res_headers = req.headers
    res_url = req.url
    
    print(res_code)
    print(res_encoding)
    print(res_headers)
    print(res_url)

    4.session对象

    在Requests中,实现了Session(会话)功能,当我们使用Session时,能够像浏览器一样,在没有关闭关闭浏览器时,能够保持住访问的状态。 这个功能常常被我们用于登陆之后的数据获取,使我们不用再一次又一次的传递cookies。

    首先我们需要去生成一个Session对象,然后用这个Session对象来发起访问,发起访问的方法与正常的请求是一摸一样的。

    session = requests.session()
    req = session.get("http://www.baidu.com")
    req.encoding = "utf-8"
    res = req.text
    print(res)

    同时,需要注意的是,如果是我们在get()方法中传入headers和cookies等数据,那么这些数据只在当前这一次请求中有效。如果你想要让一个headers在Session的整个生命周期内都有效的话,需要用以下的方式来进行设置:

    # 实例一个对象
    session = requests.session()
    
    # 设置整个headers
    session.headers = {
        "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
    }
    # 增加一条header
    session.headers.update({"x-test":"true"})
    
    req = session.get("http://www.jianshu.com",headers=session.headers)
    req.encoding = "utf-8"
    res = req.text
    print(res)
  • 相关阅读:
    20145312 实验四《Andoid开发基础》
    20145312 《Java程序设计》第九周学习总结
    20145312 《Java程序设计》第八周学习总结
    20145312 实验三《敏捷开发与XP实践》
    20145312 《Java程序设计》第七周学习总结
    20145312 实验二《 Java面向对象程序设计》
    20145309李昊 信息安全系统设计基础第1周学习总结
    20145309《信息安全系统设计基础》第0周学习总结
    20145303课程总结
    20145215刘俊谦实验五 Java网络编程及安全
  • 原文地址:https://www.cnblogs.com/zgzeng/p/11808185.html
Copyright © 2020-2023  润新知