zoukankan      html  css  js  c++  java
  • Request模块

    1. 请求方式

    # 介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) 
    # 注意:requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求
    
    1. r = requests.request(method, url, **kwargs)  # 构造一个请求
    	# ethod(6个)  head/get/post/put/patch/delete
    	
    2. requests.head(url, **kwargs)  
    
    3. requests.get(url, params=None, **kwargs)
    	# params  # 字典或者字节序列
    	
    4. requests.post(url, data=None , json=None, **kwargs)
    	# data  # 字典字节序列或者文件,Rquest的内容
    	# json  # json格式的数据,Request的内容
    	
    5. requests.put(url, data=None, **kwargs)  #data # 字典字节序列或者文件,Rquest的内容
    
    6. requests.patch(url, data=None, **kwargs)  #data # 字典字节序列或者文件,Rquest的内容  
    
    7. requests.delete(url, *kwargs)
    
    8. requests.options(url)  
    	# Preflighted Requests是CORS中一种透明服务器验证机制。
    	# 预检请求首先需要向另外一个域名的资源发送一个 HTTP OPTIONS 请求头,其目的就是为了判断实际发送的请求是否是安全的。
    	# 跨域资源共享(CORS) 是一种机制

    1.1 参数

    """
    1. params # 字典或者字节序列
    
    2. data # 字典字节序列或者文件,Rquest的内容
    
    3. json # json格式的数据,Request的内容 
    
    4. headers # 字典,HTTP定制头
    
    5. cookies # 字典或者cookiejar,Request中的cookie
    
    6. auth # 元组,支持HTTP认证功能 
    
    7. files # 字典类型,传输文件
    #fs = {"files":open("文件名","rb")}
    #r = requests.request("POST", url, files=fs)
    
    8. timeout # 设置超时时间,单位为秒 
    
    9. proxies #字典类型,设定代理服务器
    #pxs = {"http":"ip地址1","https":"ip地址2"}
    
    10. allow_redirect重定向开关
    
    11. stream立即下载开关
    
    12. verify认证ssl证书开关  # 访问危险网站
    
    13. cert本地ssl证书路径
    """

    1.2 参数示例

    import requests
    # 文件上传
    files = {'file': open('favicon.ico', 'rb')}
    response = requests.post("http://httpbin.org/post", files=files)
    print(response.text)
    
    import requests
    # 会话保持
    s = requests.Session()
    s.get('http://httpbin.org/cookies/set/number/123456789')
    response = s.get('http://httpbin.org/cookies')
    print(response.text)
    import requests
    from requests.packages import urllib3  # 忽略警告
    urllib3.disable_warnings()
    response = requests.get('https://www.12306.cn', verify=False)
    print(response.status_code)
    
    response = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key'))  # 证书
    print(response.status_code)
    import requests
    # 代理设置
    proxies = {
      "http": "http://127.0.0.1:9743",
      "https": "https://127.0.0.1:9743",
    }
    
    response = requests.get("https://www.taobao.com", proxies=proxies)
    print(response.status_code)
    
    # =======================
    
    import requests
    # 私密代理
    # 如果代理需要使用HTTP Basic Auth,可以使用下面这种格式:
    proxy = { "http": "mr_mao_hacker:sffqry9r@61.158.163.130:16816" }
    
    response = requests.get("http://www.baidu.com", proxies = proxy)
    
    print (response.text)
    import requests
    from requests.exceptions import ReadTimeout
    # 超时设置
    try:
        response = requests.get("http://httpbin.org/get", timeout = 0.5)
        print(response.status_code)
    except ReadTimeout:
        print('Timeout')
    import requests
    from requests.auth import HTTPBasicAuth
    # 认证设置
    r = requests.get('http://120.27.34.24:9001', auth=HTTPBasicAuth('user', '123'))
    print(r.status_code)
    
    #=============
    
    import requests
    
    r = requests.get('http://120.27.34.24:9001', auth=('user', '123'))
    print(r.status_code) 
    import requests
    from requests.exceptions import ReadTimeout, ConnectionError, RequestException
    # 异常处理
    try:
        response = requests.get("http://httpbin.org/get", timeout = 0.5)
        print(response.status_code)
    except ReadTimeout:
        print('Timeout')
    except ConnectionError:
        print('Connection error')
    except RequestException:
        print('Error') 

    2. get请求

    import requests
    
    """
    GET请求
    HTTP默认的请求方法就是GET
         * 没有请求体
         * 数据必须在1K之内!
         * GET请求数据会暴露在浏览器的地址栏中
    
    GET请求常用的操作:
           1. 在浏览器的地址栏中直接给出URL,那么就一定是GET请求
           2. 点击页面上的超链接也一定是GET请求
           3. 提交表单时,表单默认使用GET请求,但可以设置为POST
    """
    
    payload = {'key1': 'value1', 'key2': 'value2'}
    r = requests.get("http://httpbin.org/get", params=payload)  # params可变个数的
    import requests
    
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36"}
    
    # 西瓜视频下载
    url = "http://v6-default.ixigua.com/65bee02999486d44e8f1be9c9babb660/5e1f482b/video/tos/cn/tos-cn-ve-4/bc2afd90dfec4b91aa75512c79f90107/?a=1217&br=1452&bt=726&cr=0&cs=0&dr=0&ds=2&er=&l=202001160010000100140470160A7FCB5C&lr=&qs=0&rc=ajx2czRmanF2cjMzZTczM0ApOGhpZ2dlZmUzNzszOjc2M2dgZ29rbGtiZGJfLS0wLS9zcy42NF5fNTMwNV8wXzA2YjM6Yw%3D%3D"
    
    r = requests.get(url=url, headers=headers, stream=True)  # steam
    
    with open("一个人挺好-李知恩(合成).mp4", "wb") as video:
        for chunk in r.iter_content(chunk_size=1024 * 1024):
            if chunk:
                video.write(chunk)

    3. post请求

    """
    POST请求
    (1). 数据不会出现在地址栏中
    (2). 数据的大小没有上限
    (3). 有请求体
    (4). 请求体中如果存在中文,会使用URL编码!
    
    注意:
       1、对于登录来说,应该输错用户名或密码然后分析抓包流程,用脑子想一想,输对了浏览器就跳转了,还分析个毛线,累死你也找不到包
      2、要做登录的时候一定记得要把cookie先清除
      3、requests.session():中间的cookie都不用自己分析了,有用的没用的都给放进来了
      4、response.cookies.get_dict()   
    """  

    4. response属性

    import requests
    import json
    
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36"}
    
    url = "http://www.baidu.com"
    
    response = requests.get(url=url, headers=headers)
    
    print(response)  # <Response [200]>
    
    ret = response.request  # <PreparedRequest [GET]>
    print(ret)
    
    ret = response.headers  # network中Response Headers部分
    print(ret)
    
    ret = response.url
    print(ret)
    
    ret = response.status_code
    print(ret)
    
    ret = response.text  # 返回是str类型的数据
    print(ret)
    # Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 response.text 之时,Requests 会使用其推测的文本编码。
    # 你可以找出 Requests 使用了什么编码,并且能够使用 response.encoding 属性来改变它
    
    ret = response.content  # 返回是bytes类型的数据
    print(ret)
    
    ret = response.cookies  # # <RequestsCookieJar[<Cookie H_PS_PSSID=1420_21094_30495_22157 for .baidu.com/>, <Cookie delPer=0 for .baidu.com/>, <Cookie BDSVRTM=0 for www.baidu.com/>, <Cookie BD_HOME=0 for www.baidu.com/>]>
    ret2 = response.cookies.get_dict()
    ret3 = requests.utils.dict_from_cookiejar(response.cookies)  # cookie字典
    print(ret)
    print(ret2)  # {'H_PS_PSSID': '1440_21110_30491_26350_30502', 'delPer': '0', 'BDSVRTM': '0', 'BD_HOME': '0'}
    print(ret3)  # {'H_PS_PSSID': '1440_21110_30491_26350_30502', 'delPer': '0', 'BDSVRTM': '0', 'BD_HOME': '0'}
    
    res1 = json.loads(response.text)  # 太麻烦
    print(res1)  # {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.22.0'}, 'origin': '111.121.69.119, 111.121.69.119', 'url': 'https://httpbin.org/get'}
    res2 = response.json()  # 直接获取json数据
    print(res2)  # {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.22.0'}, 'origin': '111.121.69.119, 111.121.69.119', 'url': 'https://httpbin.org/get'}
    print(res1 == res2)  # True
    
    ret = response.encoding  # 从http中猜测编码  # 还可以通过这个属性设置正确的编码
    print(ret)  # ISO-8859-1
    
    ret = response.apparent_encoding  # 从内容中分析出编码,这个更加准确
    print(ret)  # utf-8
    
    ret = response.elapsed  # 流逝了多少时间
    print(ret)
    
    ret = response.history  # [<Response [302]>]
    print(ret)
    # 默认情况下,除了request.head(), Requests 会自动处理所有重定向。可以使用响应对象的 history 方法来追踪重定向。
    # Response.history 是一个 Response 对象的列表,为了完成请求而创建了这些对象。这个对象列表按照从最老到最近的请求进行排序。
    # 重定向:浏览器发送请求,服务器返回重定向的状态码和location,没有响应体。浏览器会自动再发送给location的url一次请求,才能得到响应体。
    # Request URL: https://static.zhihu.com/heifetz/main.app.585bb6255dc0a63109f3.js
    # Referer: https://www.zhihu.com/signin?next=%2F  # 从哪个网页过来的(去请求js)
    # Location:https://www.zhihu.com/signin?next=%2F  # 重定向到这个url
    

    5. 处理url

    5.1 url拼接

    from urllib import parse
    
    
    domain = ""
    url_list = []
    for url_details in url_list:
        url = parse.urljoin(domain, url_details.xpath())
    

    5.2 url编码

    import requests
    
    
    requests.utils.unquote("xxxxxx")  # unquote解码  
    requests.utils.quote("中国")  # quote编码

    5.3 url编码2

    from urllib import parse
    #import urllib  # urllib是包(包下有多个模块,import 包名可以导入包中所有模块(和这个一样from urllib import *))
    
    
    dic = {"kw":"Python语言"}
    str = "https://www.baidu.com/s?wd=Python语言"
    s = parse.urlencode(dic, encoding="utf8")
    url = "https://www.baidu.com/s?{}".format(s)
    
    print(url)  # https://www.baidu.com/s?kw=Python%E8%AF%AD%E8%A8%80
    
  • 相关阅读:
    排序算法
    彩票随机6+1,开发实例
    synchronized关键字以及对象锁和类锁的区别
    shell基础
    easyui+Spring MVC+hibernate = 乐途
    easyui + jdbc 实现简单的数据库管理。
    js map
    struts2 using kindeditor upload pictures (including jmagic compressed images)
    easyui filebox 浏览图片
    easyui datagrid to excel
  • 原文地址:https://www.cnblogs.com/yzg-14/p/12190146.html
Copyright © 2011-2022 走看看