• 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)

    ####

    ####

  • 相关阅读:
    Sort it
    set 集合容器
    convertToString与ToString的区别
    string基本字符系列容器
    辗转相除法
    进程的总结
    进程池进阶
    进程池
    生产者消费者模型
    IPC :进程之间的通信
  • 原文地址:https://www.cnblogs.com/andy0816/p/15257011.html
Copyright © 2020-2023  润新知