zoukankan      html  css  js  c++  java
  • urllib库的使用(二)-----python3

    这便是urllib库中request模块的基本用法,如果想实现更多的功能,可以参考官方文档的说明

    高级用法:
    对于一些更高级的操作(比如Cookies处理、代理设置等),就需要更强大的工具Handler,urllib.request模块里的BaseHandler类,是所有其他Handler的父类,它提供了最基本的方法:

    如:default_open()、protocol_request()等

    以下为各种Handler子类继承了这个BaseHandler类:

    HTTP

    • HTTPDefaultErrorHandler:用于处理HTTP响应错误,错误都会抛出
    • HTTPError类型的异常。
    • HTTPRedirectHandler:用于处理重定向。
    • HTTPCookieProcessor:用于处理Cookies。
    • ProxyHandler:用于设置代理,默认代理为空。
    • HTTPPasswordMgr:用于管理密码,它维护了用户名和密码的表。
    • HTTPBasicAuthHandler:用于管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题。
    • 还有其他的Handler类,详情可以参考官方文档。

    另一个比较重要的类就是OpenerDirector,我们可以称为Opener。我们之前用过urlopen()这个方法,实际上它就是urlib为我们提供的一个Opener。引入Opener是因为需要实现更高级的功能。
    Request和urlopen()相当于类库为你封装好了极其常用的请求方法,可以完成基本的请求,但要实现更高级的功能,所以需要深入一层进行配置,使用更底层的实例来完成操作,所以这里就用到了Opener。Opener可以使用open()方法,返回的类型和urlopen()如出一辙,它实际上是利用Handler来构建Opener。

    esponse = opener.open(‘网址’)

    代理

    from urllib.request import ProxyHandler, build_opener
    from urllib.error import URLError
    #ProxyHandler:用于设置代理,默认代理为空
    proxy_handler = ProxyHandler({
        'http':'http://127.0.0.1:9743', 
        'https':'https://127.1.1.1:9743'
    })
    opener = build_opener(proxy_handler)
    try:
        response = opener.open('https://www.baidu.com')
        print(response.read().decode('utf-8'))
    except URLError as e:
        print(e.reason)

    搭建了一个代理,它运行在9743端口上。proxy_handler = ProxyHandler(参数),其参数是一个字典,键名是协议类型(比如http或者https等),键值是代理链接,可以添加多个代理。然后,利用这个Handler及build_opener()方法构造一个Opener,之后发送请求即可。用try:…except URLError as e:…出错处理。所以需要提前引用 urllib.request 中的 ProxyHandler, build_opener,还有出错处理
    urllib.error中的 URLError

    Cookies先用实例将网站的Cookies获取下来

    import http.cookiejar, urllib.request
    cookie = http.cookiejar.CookieJar()#必须声明一个CookieJar对象
    handler = urllib.request.HTTPCookieProcessor(cookie)#用于处理Cookies,利用HTTPCookieProcessor来构建一个Handler
    opener = urllib.request.build_opener(handler)#利用build_opener()方法构建出Opener
    response = opener.open('https://www.baidu.com')#执行open()函数
    #输出了每条Cookie的名称和值
    for item in cookie:
        print(item.name + '=' + item.value)

    运行结果:

    BAIDUID=ACAE046E69F4FEB1F128326541EFDC63:FG=1
    BIDUPSID=ACAE046E69F4FEB106748254A656B3D0
    PSTM=1579617897
    BD_NOT_HTTPS=1

    将Cookies以文本形式保存。

    import http.cookiejar, urllib.request
    filename = 'cookies.txt'
    cookie = http.cookiejar.MozillaCookieJar(filename)
    handler = urllib.request.HTTPCookieProcessor(cookie)
    opener = urllib.request.build_opener(handler)
    response = opener.open('https://www.baidu.com')
    cookie.save(ignore_discard=True, ignore_expires=True)

    读取和保存Cookies时,运行之后,在当前目录下生成一个cookies.txt文件,用于保存Cookies的内容
    这时CookieJar就需要换成MozillaCookieJar,它在生成文件时会用到,是CookieJar的子类,可以用来处理Cookies和文件相关的事件,比如读取和保存Cookies,可以将Cookies保存成Mozilla型浏览器的Cookies格式。

    运行结果:

    Netscape HTTP Cookie File http://curl.haxx.se/rfc/cookie_spec.html
    This is a generated file! Do not edit.

    .baidu.com TRUE / FALSE 1611197170 BAIDUID
    2CD1C4092638B0A63729B0E010C8D529:FG=1 .baidu.com TRUE / FALSE
    3727144817 BIDUPSID 2CD1C4092638B0A6471FB396DD99FD27 .baidu.com TRUE /
    FALSE 3727144817 PSTM 1579661192 www.baidu.com FALSE / FALSE
    1579661470 BD_NOT_HTTPS 1

    要保存成LWP格式的Cookies文件

    filename = 'cookies.txt'
    cookie = http.cookiejar.LWPCookieJar(filename)#LWPCookieJar同样可以读取和保存Cookies,它会保存成libwww-perl(LWP)格式的Cookies文件。
    handler = urllib.request.HTTPCookieProcessor(cookie)
    opener = urllib.request.build_opener(handler)
    response = opener.open('https://www.baidu.com')
    cookie.save(ignore_discard=True, ignore_expires=True)

    运行结果:

    #LWP-Cookies-2.0
    Set-Cookie3: BAIDUID="FE2536E4F58ED38A067B74CAF7D1D819:FG=1"; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2021-01-21 02:59:29Z"; comment=bd; version=0
    Set-Cookie3: BIDUPSID=FE2536E4F58ED38A54461D1439016C25; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2088-02-09 06:13:36Z"; version=0
    Set-Cookie3: PSTM=1579661992; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2088-02-09 06:13:36Z"; version=0
    Set-Cookie3: BD_NOT_HTTPS=1; path="/"; domain="www.baidu.com"; path_spec; expires="2020-01-22 03:04:29Z"; version=0

    生成了Cookies文件后,怎样从文件中读取并利用呢?
    我们以LWPCookieJar格式为例来看一下:

    #前提是已经生成了LWPCookieJar格式的Cookies,并保存成文件,例如下面的cookies.txt,在上面已经生成
    import http.cookiejar, urllib.request
    cookie = http.cookiejar.LWPCookieJar()
    cookie.load('cookies.txt', ignore_discard=True, ignore_expires=True)#调用load()方法来读取本地的Cookies文件,获取到了Cookies的内容
    handler = urllib.request.HTTPCookieProcessor(cookie)
    opener = urllib.request.build_opener(handler)
    response = opener.open('https://www.baidu.com')
    print(response.read().decode('utf-8'))#运行结果会输出指定网页的源代码。

    运行结果:
    在这里插入图片描述
    HTTP协议请求实战

    如果要进行客户端与服务器端之间的消息传递,我们可以使用HTTP协议请求进行。
    HTTP协议请求主要分为6种类型,各类型的主要作用如下:

    • GET(get)请求:GET请求会通过URL网址传递信息,可以直接在URL中写上要传递的信息,也可以由表单进行传递。如果使用表单进行传递,这表单中的信息会自动转为URL地址中的数据,通过URL地址传递。
    • POST(post)请求:可以向服务器提交数据,是一种比较主流也比较安全的数据传递方式,比如在登录时,经常使用POST请求发送数据。
    • PUT(put)请求:请求服务器存储一个资源,通常要指定存储的位置。
    • DELETE(delete)请求:请求服务器删除一个资源。
    • HEAD(head)请求:请求获取对应的HTTP报头信息。
    • OPTIONS(options)请求:可以获取当前URL所支持的请求类型。
      除此之外,还有TRACE(trace)请求与CONNECT(connect)请求等。

    接下来,将通过实例讲解HTTP协议请求中的GET请求和POST请求,这两种请求相对来说用的最多。
    GET请求示例分析

  • 相关阅读:
    Linux查看内容命令[持续添加]
    android4.0 x86下载编译简介
    android4.0 x86 裁剪与定制
    Android4.0 x86源码结构,生成目录结构
    android4.0 x86编译生成文件系统镜像system.img结构简介
    [翻译]Mootools 1.2新特性(一):元素存储(Element Storage)
    ASP.NET MVC Preview 3 STEP BY STEP 文章管理实例(一)
    Microsoft Speech API SDK
    PB串口编程资料MSCOMM32参数基本介绍
    Microsoft Speech API Overview(SAPI 5.4)
  • 原文地址:https://www.cnblogs.com/llb123/p/13398732.html
Copyright © 2011-2022 走看看