urllib库的操作(二)-----python3

原创
小哥 3年前 (2022-11-16) 阅读数 8 #大杂烩

这便是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(Parameter),其参数是字典,其键名是协议类型(例如。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请求将通过URLURL传达的信息可直接用于URL要传递的信息也可以通过表单传递。如果使用表单传递,此表单中的信息将自动转换URL地址中的数据,URL地址传递。
  • POST(post)请求:您可以向服务器提交数据,这是一种更主流、更安全的数据传输方式。例如,登录时,您经常使用它。POST请求发送数据。
  • PUT(put)请求:请求服务器存储资源,通常指定存储的位置。
  • DELETE(delete)请求:请求服务器删除资源。
  • HEAD(head)请求:请求获取相应的HTTP标题信息。
  • OPTIONS(options)请求:您可以获取当前URL支持的请求类型。
    此外,还有TRACE(trace)请求与CONNECT(connect)请求等。

接下来,将通过示例进行解释。HTTP在协议请求中GET请求和POST请求,这两个请求相对来说使用最多。
GET请求样本分析

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除