一、简介
urllib 是一个收集了多个涉及 URL 的模块的包:
urllib.request 打开和读取 URL
urllib.error 包含 urllib.request 抛出的异常
urllib.parse 用于解析 URL
urllib.robotparser 用于解析 robots.txt 文件
二、urllib.request 打开和读取 URL
1、urllib.request 模块定义了以下函数:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
打开统一资源定位符 url,可以是一个字符串或一个 Request 对象。
data 必须是一个对象,用于给出要发送到服务器的附加数据,若不需要发送数据则为 None。
urllib.request 模块采用 HTTP/1.1 协议,并且在其 HTTP 请求中包含 Connection:close 头部信息。
timeout 为可选参数,用于指定阻塞操作(如连接尝试)的超时时间,单位为秒。如未指定,将使用全局默认超时参数)。本参数实际仅对 HTTP、HTTPS 和 FTP 连接有效。
如果给定了 context 参数,则必须是一个 ssl.SSLContext 实例,用于描述各种 SSL 参数。
cafile 和 capath 为可选参数,用于为 HTTPS 请求指定一组受信 CA 证书。cafile 应指向包含CA 证书的单个文件, capath 则应指向哈希证书文件的目录。
本函数总会返回一个对象,该对象可作为 context manager 使用,带有 url、headers 和 status 属性。
from urllib.request import urlopen myURL = urlopen("https://www.cnblogs.com/windyrainy/p/15068700.html") print(myURL.read()) #输出的是字节类型 #除了 read() 函数外,还包含以下两个读取网页内容的函数: #readline() - 读取文件的一行内容 #readlines() - 读取文件的全部内容,它会把读取的内容赋值给一个列表变量。
2、urllib.request 模块定义了以下类:
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
URL 请求对象的抽象类。 url 应为包含合法 URL 的字符串。
data 必须是一个对象,用于给定发往服务器的附加数据,若无需此类数据则为 None 。 目前 唯一用到 data 的只有 HTTP 请求。支持的对象类型包括字节串、类文件对象和可遍历的类字节串对象。如果没有提供 Content-Length 和 Transfer-Encoding 头部字段, HTTPHandler 会根据 data 的类型设置这些头部字段。Content-Length 将用于发送字节对象,而 RFC 7230中定义的 Transfer-Encoding: chunked 将用于发送文件和其他可遍历对象。
对于 HTTP POST 请求方法而言,data 应该是标准 application/x-www-form-urlencoded 格式的缓冲区。 urllib.parse.urlencode() 函数的参数为映射对象或二元组序列,并返回一个该编码格式的 ASCII 字符串。在用作 data 参数之前,应将其编码为字节串。
headers 应为字典对象,视同于用每个键和值作为参数去调用 add_header() 。通常用于 User-Agent 头部数据的“伪装” ,浏览器用这些头部数据标识自己——某些 HTTP 服务器只允许来自普通浏览器的请求,而不接受来自脚本的请求。
如果给出了 data 参数,则应当包含合适的 Content-Type 头部信息。若未提供且 data 不是 None,则会把 Content-Type: application/x-www-form-urlencoded 加入作为默认值。
origin_req_host 应为发起初始会话的请求主机。默认指为``http.cookiejar.request_host(self)`` 。这是用户发起初始请求的主机名或 IP 地址。假设请求是针对 HTML 文档中的图片数据发起的,则本属性应为对包含图像的页面发起请求的主机。
unverifiable 应该标示出请求是否无法验证。默认值为 False 。所谓无法验证的请求,是指用户没有机会对请求的 URL 做验证。例如,如果请求是针对 HTML 文档中的图像,用户没有机会去许可能自动读取图像,则本参数应为 True。
method 应为字符串,标示要采用的 HTTP 请求方法(例如 'HEAD' )。如果给出本参数,其值会存储在 method 属性中,并由 get_method() 使用。如果 data 为``None`` 则默认值为 'GET' ,否则为 'POST'。子类可以设置 method 属性来标示不同的默认请求方法。
req = urllib.request.Request('https://www.cnblogs.com/windyrainy/p/15068700.html') opener = urllib.request.urlopen(req) print(opener.read()) #输出的是字节类型
三、urllib.parse 用于解析 URL
URL解析功能可以将一个URL字符串分割成其组件,或者将URL组件组合成一个URL字符串。
(1)urllib.parse 模块定义了以下函数:
urlencode()
urlparse()
>>>from urllib.parse import urlparse >>>o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html') >>>o ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='')
属性 |
索引 |
值 |
值(如果不存在) |
---|---|---|---|
|
0 |
URL协议 |
scheme 参数 |
|
1 |
网络位置部分 |
空字符串 |
|
2 |
分层路径 |
空字符串 |
|
3 |
最后路径元素的参数 |
空字符串 |
|
4 |
查询组件 |
空字符串 |
|
5 |
片段识别 |
空字符串 |
|
用户名 |
||
|
密码 |
||
|
主机名(小写) |
||
|
端口号为整数(如果存在) |