zoukankan      html  css  js  c++  java
  • Requests模块学习

    安装方式

    方式一:

    执行 pip install -U requests 联网安装requests
    pip install -U reqiests
    方式二:
     
    2.然后用cmd进入解压目录,使用命令Python setup.py install 安装requests

     模拟get请求

    import requests
    response = requests.get('http://www.hnxmxit.com')

    如果想在控制台看到访问结果,可使用

    # 方法一
    print(response.content.decode('utf-8'))
    
    # 方法二
    print(response.text)

    备注:方法二会有乱码,原因是因为response.text返回的是Unicode格式,通常需要转换为utf-8格式

    response.encoding = 'utf-8'
    print(response.text)

    模拟带参数的get请求

    import requests
    
    # 方式1:将参数写入url地址
    response_01 = requests.get("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET")
    print(response_01.content.decode('utf-8'))
    import requests
    
    # 方式2:将传入参数携程字典,然后在放到requests.get("url",parameter_data)中
    parameter_data = {
        'grant_type' : 'client_credential',
        'appid' : 'APPID',
        'secret' : 'APPSECRET'
    }
    #
    response_02 = requests.get("https://api.weixin.qq.com/cgi-bin/token", parameter_data)
    print(response_02.content.decode('utf-8'))

    模拟请求头

    import requests
    
    search_data = {"wd": "新梦想软测"}
    header_info = {
        'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
        'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
        'Accept-Encoding': "gzip, deflate, br",
        'Accept-Language': "zh-CN,zh;q=0.9",
    }
    
    response = requests.get(url="https://www.baidu.com", params=search_data, headers=header_info)
    print(response.content.decode('utf-8'))

    备注:如果带请求头,必须按博主这样写requests.get(url='', params="", headers="")

    模拟post请求-json数据传输

    在python中,可以将每一个dict看成是一个json对象

    json.jumps() -- 用于将字典形式的数据转化为字符串

    json.loads() -- 用于将字符串形式的数据转化为字典

    # 模拟post请求json数据传输方式一:将传送的json数据使用jumps方法转化为字符串格式再用传输数据的方式进行传输
    import json
    import requests
    
    params_data = {
        "access_token": '34_2icB2gvMB_RKpvIBGFoHU5zbPZPj9XRnfZPBtg9BIv1PxQPe4ELw6uQ6cjMbXSvCpi9PKkkMvM4kAiWyAGdwgX4synUQMrB9GpwPwpqorlzXP-yT52TdJt8AmuwgV2607BLYmJKv_wOle7YGYYCaAAAOOS'}
    head_infos = {'Content-Type': 'application/json'}
    post_params_data = {"tag": {"id": 148, "name": "test00001"}}
    response = requests.post(url="https://api.weixin.qq.com/cgi-bin/tags/update",
                             params=params_data,
                             data=json.dumps(post_params_data),
                             headers=head_infos)
    
    print(response.content.decode('utf-8'))
    # 模拟post请求json数据传输方式二:直接使用json=post_params_data将json数据传输
    import json
    import requests
    
    params_data = {"access_token": '34_IfKhYb3sA-xvxgrxZtJqY2NSAVch4Y6gS0q5FgnRYpzJLhCaUTr4ayaEZlUU3HVWoQUVa8p-7lt5KlJU6P6NhO5RKn2TdM9fLORu0atbhYkx1LR8iOTp5SxJzMQjTdTU8REM9ti1HvRTeNq6KWLeABAQCR'}
    head_infos = {'Content-Type': 'application/json'}
    post_params_data = {"tag": {"id": 148, "name": "test00002"}}
    response = requests.post(url="https://api.weixin.qq.com/cgi-bin/tags/update",
                             params=params_data,
                             json=post_params_data,
                             headers=head_infos)
    
    print(response.content.decode('utf-8'))

    模拟post请求-文件上传

    # 简单方法
    import requests
    
    excel_file_upload = {"file": open('csv_data.excel', 'rb')}
    fileResponse = requests.post("http://httpbin.org/post", files=excel_file_upload)
    print(fileResponse.content.decode('utf-8'))
    # 显示地设置文件名,文件类型,请求头和到期时间
    import requests
    
    excel_file_upload = {"file": ('csv_data.xls', open('csv_data.csv', 'rb'), 'application/vnd.ms-excel', {'Expires': "0"})}
    response = requests.post("http://httpbin.org/post", files=csv_file_upload)
    print(response.content.decode('utf-8'))

    获取响应内容

    import requests
    
    response = requests.get('http://www.hnxmxit.com')
    # 获取响应状态码
    print(response.status_code)
    # 获取响应信息
    print(response.reason)
    # 获取响应头
    print(response.headers)
    # 获取请求地址
    print(response.url)
    # 获取cookies
    print(response.cookies)
    # 获取响应的编码格式
    print(response.encoding)
    # 获取响应内容
    response.encoding='utf-8'
    print(response.text)
    # 二进制获取响应内容
    print(response.content.decode('utf-8'))

    json相应内容:

      Requests中有一个内置的JSON解码器.json(),处理返回的JSON数据。使用后,会把返回的数据作为一个python中的json数据对象看待。如果JSON解码失败,r.json()就会抛出一个异常

    # 使用json()方法获取access_token值
    parameter_data = {
        'grant_type' : 'client_credential',
        'appid' : 'wxec83eaada223a9c8',
        'secret' : '1867d7f1cabb3bafae0b7304e8251a09'
    }
    
    response_02 = requests.get("https://api.weixin.qq.com/cgi-bin/token", parameter_data)
    # 获取返回json中的键值方式一:
    print(response_02.json()['access_token'])
    # 获取返回json中的键值方式二:
    json_data = response_02.json()
    print(json_data['access_token'])

    下载图片文件

    import requests
    from PIL import Image
    from io import BytesIO
    
    response = requests.get('https://w.wallhaven.cc/full/ey/wallhaven-eyggo8.jpg')
    img_upload = Image.open(BytesIO(response.content))
    img_upload.save('test.png')

     代理设置

    1.代理设置

      代理(英文:Proxy),也称为网络代理,是一种特殊的网络服务,英文全称是(Proxy Server),其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站。代理服务器就好象一个大的Cache,这样就能显著提高浏览速度和效率。

    使用代理格式

    import requests
    
    proxies = {
        "http": "http://ip:端口号",
        "https":"https://ip:端口号"
    }
    requests.get("url", proxies=proxies)

    使用需要账号和密码的代理

    import requests
    
    proxies = {
        "http": "http://username:password@ip:端口号",
        "https": "https://username:password@ip:端口号"
    }
    requests.get("url", proxies=proxies)

     示例

    import requests
    
    # 使用代理获取百度首页
    header_info = {
        'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36",
        'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
        'Accept-Encoding': "gzip, deflate, br",
        'Accept-Language': "zh-CN,zh;q=0.9",
    }
    #  定义代理的字典
    proxies = {
        "http": "http://127.0.0.1:8889"
    }
    
    # 使用代理给服务器发送请求
    response = requests.get("https://www.baidu.com", proxies=proxies, headers=header_info)
    # 获取状态
    print(response.status_code)
    print(response.content.decode('utf-8'))
    示例

    超时设置

    Requests可以设置接收数据的超时时间,超出设定的时间还没有数据返回,就抛出异常。超时设置有两种类型表达:float 、tuple,超时单位是秒
    import requests
    
    # 接收数据超时时间
    response_01 = requests.get('https://www.baidu.com', timeout=0.002)
    print(response_01 .status_code)
    print(response_01 .content.decode('utf-8'))
    import requests
    
    # 0.1代表链接超时,0.2代表接受数据的超时时间
    response_02 = requests.get('https://www.baidu.com', timeout=(0.1, 0.2))
    print(response_02.status_code)
    print(response_02.content.decode('utf-8'))
    import requests
    
    # 如果网址访问速度慢,可以使用timeout=None
    response_03 = requests.get('https://www.baidu.com', timeout=None)
    print(response_03.status_code)
    print(response_03.content.decode('utf-8'))

     重定向设置

     在请求URL时,服务器会自动把请求重定向,可以使用r.history进行查看重定向,如果不想自动重定向,可以使用参数allow_redirects=False关闭。
    import requests
    
    response = requests.get("http://www.360buy.com")
    # 查看重定向
    print(response.history)
    import requests
    # 关闭重定向
    response = requests.get("http://www.360buy.com", allow_redirects=False)
    print(response.history)

    SSL Cert Verification

    很多网站都是HTTPS,(HTTPS 在HTTP 的基础下加入SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。)但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书,如百度知乎等都是没有硬性要求,但是有硬性要求的则必须带,比如对于定向用户,拿到证书才有权限访问某个特定网站。

    访问网址时,如果是SSL请求,首先会检查证书是否合法,不合法报错

    import requests
    
    response = requests.get('https://www.xxxx.com')
    print(response.content.decode())

    访问网址时,不验证证书的方法

    import requests
    
    response = requests.get('https://www.xxxx.com', verify=False)
    print(response.content.decode())

    但是如果不验证证书,会报警告

    D:Softwarepythonlibsite-packagesurllib3connectionpool.py:979: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.baidu.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
      warnings.warn(

    解决警告的三种方法

    方法一:缺点:只有安装'requests==2.6.0'版本才能使用这个方法(pip install --upgrade --force-reinstall 'requests==2.6.0' urllib3)

    import requests
    from requests.packages import urllib3
    
    urllib3.disable_warnings() #关闭警告 
    response = requests.get('https://www.baidu.com', verify=False)
    print(response.content.decode())

    方法二:加上证书

    import requests
    
    response = requests.get('https://www.xxxxxx.com', cert=('/path/server.crt', '/path/key'))
    print(response.content.decode())

    方法三:忽略警告

    import requests
    import warnings
    
    # 忽略警告
    warnings.filterwarnings("ignore")
    response = requests.get('https://www.baidu.com', verify=False)
    print(response.content.decode())
  • 相关阅读:
    C++ 注意事项
    Google protocol buffer的配置和使用(Linux&&Windows)
    网络编程的一些错误总结
    C++单例模式设计与实现
    TCP粘包处理
    C++ 局部静态变量,全局变量,全局静态变量,局部变量的区别和联系
    C++模板类注意事项
    Django框架(二十二)—— Django rest_framework-频率组件
    Django框架(二十一)—— Django rest_framework-权限组件
    Django框架(二十)—— Django rest_framework-认证组件
  • 原文地址:https://www.cnblogs.com/ClownAlin/p/13062024.html
Copyright © 2011-2022 走看看