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请求示例分析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值