urllib学习

一、简介

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='')

属性

索引

值(如果不存在)

scheme

0

URL协议

scheme 参数

netloc

1

网络位置部分

空字符串

path

2

分层路径

空字符串

params

3

最后路径元素的参数

空字符串

query

4

查询组件

空字符串

fragment

5

片段识别

空字符串

username

 

用户名

None

password

 

密码

None

hostname

 

主机名(小写)

None

port

 

端口号为整数(如果存在)

None

posted @ 2021-08-18 11:27  Einewhaw  阅读(16)  评论(0编辑  收藏  举报