zoukankan      html  css  js  c++  java
  • 4-06python语法基础-内置模块-urllib模块,以及第三方模块requests的使用,cookie字典生成式,切url的末尾字符串

    ###

    官方文档:https://docs.python.org/zh-cn/3/library/urllib.request.html#module-urllib.request

    ###

    urllib模块介绍:

    一共是四块,

    urllib.request - 打开和读取 URL。
    urllib.error - 包含 urllib.request 抛出的异常。
    urllib.parse - 解析 URL。
    urllib.robotparser - 解析 robots.txt 文件。

    ###

    基本使用

    from  urllib import parse
    from  urllib import request
    from  urllib import response
    from  urllib import error
    from  urllib import robotparser
    
    # url = "https://www.baidu.com/"
    url = "https://www.runoob.com/"
    resp = request.urlopen(url)
    # print(resp)
    print(resp.status)
    print(resp.getcode())
    # print(resp.url)
    # print(resp.headers)
    # print(resp.read())
    # print(resp.readlines())
    """
    getcode()  ---- 效果就是status的效果,
    使用 read() 函数获取网页的 HTML 实体代码。  # 这是一个二进制的
    readline() - 读取文件的一行内容
    readlines() - 读取文件的全部内容,它会把读取的内容赋值给一个列表变量。
    URL 的编码与解码可以使用 urllib.request.quote() 与 urllib.request.unquote() 方法:
    """

    ####

    设置headers,

    import urllib.request
    # import urllib.parse
    
    url = 'https://www.runoob.com/?s='  # 菜鸟教程搜索页面
    keyword = 'Python 教程'
    key_code = urllib.request.quote(keyword)  # 对请求进行编码
    url_all = url+key_code
    header = {
        'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
    }   #头部信息
    request = urllib.request.Request(url_all,headers=header)
    print(request)  # 打开统一资源定位符 url,可以是一个字符串或一个 Request 对象。
    
    reponse = urllib.request.urlopen(request).read()


    ###

    快捷下载图片或者html文本

    from  urllib import request
    
    imgurl = 'xxx' 
    request.urlretrieve(imgurl,"./myimg.jpeg")

    ###

    requests模块

    这个是第三方模块,需要安装

    pip install requests

    ###

    http的8种请求方式:get,post,put,delete,option,trace,connect,head,

    主要就是get和post,

    ### 

    request源码分析

    # requests源码解析,
    
    import requests
    requests.get(url,)
    
    # 里面除了url参数还有什么参数?
    #看源码,这个get请求是取调用了request,
    def get(url, params=None, **kwargs):
        kwargs.setdefault('allow_redirects', True)
        return request('get', url, params=params, **kwargs)
    
    # 然后request最后是返回了session.request()
    def request(method, url, **kwargs):
        with sessions.Session() as session:
            return session.request(method=method, url=url, **kwargs)
    
    # 而session.request()里面有很多的参数,
    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): XXX
    
    # 参数解释
    # data 这是携带请求体里面的数据,字典格式,    
    # headers 这是携带请求头,字典格式,
    # cookies 这是携带请求的cookies信息,字典格式,
    # proxies 这个是使用代理,也是字典格式,
    # verify 如果是https请求,把这个=FALSE,就是不校验证书,

    ###

    分析response响应数据

    import requests
    
    res = requests.get(url)
    
    print(dir(res))
    
    #通过这个dir查看一下这个返回值,有什么方法?
    [ 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 
    'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json',
    'links', 'next', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url'] #去掉双下划线的方法,解释一下这些方法, # content,返回一个二进制的响应内容, # cookies,打印出cookies信息, # encoding,打印出编码类型 # headers,打印出headers信息, # status_code,打印状态码 # text,打印出编码后的响应内容 # url,打印出本次请求的url,

    ### 

    python-使用字典推导式把cookie从字符串转换成字典

    cookies = "vaptchaNetway=cn; Hm_lvt_337e99a01a907a08d00bed4a1a52e35d=1628248083,1629106799; " 
              "sessionid=g1siko0evn5hmnn3pbgl0vaoqjx29cfo; Hm_lpvt_337e99a01a907a08d00bed4a1a52e35d=1629124377"
    
    # 不使用字典推导式的写法
    cookie_list = cookies.split(";")
    cookie_dict = {}
    print(cookie_list)
    for cookie in cookie_list:
        cookie_dict[cookie.split("=")[0].strip()] = cookie.split("=")[1].strip()
    
    print(cookie_dict)
    
    # 使用字典推导式的写法
    print({cookie.split("=")[0].strip():cookie.split("=")[1].strip()for cookie in cookies.split(";")})

    ###

    切url的末尾字符串

    url = "http://n.sinaimg.cn/news/1_img/upload/cf3881ab/67/w1000h667/20200710/1349-iwasyei8902095.jpg"
    
    # 三种办法 切到----1349-iwasyei8902095.jpg
    print(url.split("/")[len(url.split("/"))-1])  # 取值列表的最后一个元素
    print(url.split("/")[-1])  # 取值列表的最后一个元素
    print(url.rsplit("/",1)[1])  # 这个就是从右侧分隔字符串,分隔一次,所以要取第二个,

    ###

    requests报错解决

    requests.exceptions.SSLError: HTTPSConnectionPool(host='www.kuaidaili.com', port=443): Max retries exceeded with url: /free/inha/2/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1129)')))

    解决方法:

    requests.get(url.format(i), headers=headers, cookies=cookie_dict, verify=False)

    重点是增加 verify=False

    可能会有一个警告,

    增加2行代码,去掉警告,

    import urllib3

    urllib3.disable_warnings()

    ####

    固定header头顺序

    在使用 requests 发送 post 请求时保持 headers 的顺序不变

    import requests
    
    url = "xxx"
    headers = {
        "Host": "match.yuanrenxue.com",
        "Connection": "keep-alive",
        "Content-Length": "0",
        "Origin": "http://match.yuanrenxue.com",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
        "Accept": "*/*",
        "Referer": "http://match.yuanrenxue.com/match/3",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9",
    }
    # 先session
    session=requests.Session()
    # 后session clear,clear这个是比较关键的写法。
    session.headers.clear()
    session.headers.update(
        headers
    )
    resp=session.post(url)

    ####

    requests添加代理

    import requests
    
    proxies = {
      "http": "http://10.10.1.10:3128",
      "https": "http://10.10.1.10:1080",
    }
    
    requests.get("http://example.org", proxies=proxies)

    ####

    打印你请求的headers

    print(response.request.headers)

    ####

    ####

  • 相关阅读:
    POJ3159 Candies —— 差分约束 spfa
    POJ1511 Invitation Cards —— 最短路spfa
    POJ1860 Currency Exchange —— spfa求正环
    POJ3259 Wormholes —— spfa求负环
    POJ3660 Cow Contest —— Floyd 传递闭包
    POJ3268 Silver Cow Party —— 最短路
    POJ1797 Heavy Transportation —— 最短路变形
    POJ2253 Frogger —— 最短路变形
    POJ1759 Garland —— 二分
    POJ3685 Matrix —— 二分
  • 原文地址:https://www.cnblogs.com/andy0816/p/15257011.html
Copyright © 2011-2022 走看看