写点什么

【Python 技能树共建】python urllib 模块

作者:梦想橡皮擦
  • 2022 年 7 月 05 日
  • 本文字数:2120 字

    阅读完需:约 7 分钟

Python urllib 模块是什么

urllib 模块是 Python 标准库,其价值在于抓取网络上的 URL 资源,入门爬虫时必学的一个模块。


不过更多的爬虫工程师上手学习的模块已经更换为 requests 了。


在 Python3 中 urllib 模块包括如下内容。


  • urllib.request:请求模块,用于打开和读取 URL;

  • urllib.error:异常处理模块,捕获 urllib.error 抛出异常;

  • urllib.parse:URL 解析,爬虫程序中用于处理 URL 地址;

  • urllib.robotparser:解析 robots.txt 文件,判断目标站点哪些内容可爬,哪些不可以爬,但是用的很少。

怎么用

上手案例

打开一个测试站点,然后返回服务器响应内容。


from urllib.request import urlopen
with urlopen('https://www.example.net') as html: page = html.read()
print(page)
复制代码


上述代码用到了 urllib.requests 模块,其内部定义了打开 URL 的函数,授权验证的方法,重定向,cookie 操作等方法。


代码中用到的 urlopen() 函数,就是打开一个 URL,该函数的语法格式如下所示:


urllib.request.urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,            *, cafile=None, capath=None, cadefault=False, context=None)
复制代码


参数描述如下所示:


  • url:请求地址;

  • data:发送到服务器的其他数据对象,默认为 None;

  • timeout:超时时间;

  • cafilecapath:cafile 为 CA 证书, capath 为 CA 证书的路径,使用 HTTPS 需要用到;

  • context:ssl.SSLContext 类型,用来指定 SSL 设置。


调用该对象的 read() 方法,可以读取到整个网页数据。


其余的函数与文件读取类似,分别是 readline()readlines()


还可以调用对象的 getcode() 方法,获取网页状态码。


print(html.getcode()) # 返回 200
复制代码

urlopen() 返回对象的更多方法

使用 urlopen() 可以得到一个 HTTPResposne 类型的对象,它包括上文提及的 read() 方法,getcode() 方法,除此之外,还有如下内容可以使用。


  • getheaders():获取请求头内容;

  • getheader(name):获取指定请求头;

  • msg:信息属性;

  • version:版本属性;

  • status:状态属性。

urllib.Request() 类

URL 请求抽象类,使用它可以扩展更多的请求配置,其构造方法如下所示:


def __init__(self, url, data=None, headers={},                 origin_req_host=None, unverifiable=False,                 method=None)
复制代码


其参数说明如下所示:


  • url:请求地址,必选参数;

  • data:请求参数,必须为 bytes 类型数据,可以使用 urlencode() 进行编码;

  • headers:字典类型,请求头设置;

  • origin_req_host:请求的主机地址,IP 或域名;

  • method:请求方法。


测试代码如下所示:


from urllib import request, parse
url = 'http://httpbin.org/post'headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) 你的UA'}dict = { 'name': 'xiangpica'}# 转换数据类型data = bytes(parse.urlencode(dict), encoding='utf8')# 实例化对象req = request.Request(url=url, data=data, headers=headers, method='POST')# 添加请求头req.add_header('HOST', 'httpbin.org')# 发送数据response = request.urlopen(req)print(response.read().decode('utf-8'))
复制代码

urllib.parse

该模块主要用于解析 URL,函数原型如下所示:


urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)
复制代码


参数说明如下:


  • urlstring:URL 地址;

  • scheme:协议类型,可用的包括 file、ftp、gopher、hdl、http、https、imap、mailto、 mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、 sip、sips、snews、svn、svn+ssh、telnet……;

  • allow_fragments:是否忽略 URL 中的 fragment 部分。


标准的 URL 格式如下:


scheme://netloc/path;params?query#fragment
复制代码


说明如下所示


  • scheme:URL 协议;

  • netloc:域名和端口;

  • path:路径;

  • params:最后一个路径元素参数,不常用;

  • query:查询字符串;

  • fragment:片段标志。


from urllib.parse import urlparse
result = urlparse('http://www.example.com/index.html;info?id=10086#comment')print(type(result), result)print(result.scheme, result[0])print(result.netloc, result[1])print(result.path, result[2])print(result.params, result[3])print(result.query, result[4])print(result.fragment, result[5])
复制代码


运行结果如下所示:


<class 'urllib.parse.ParseResult'> ParseResult(scheme='http', netloc='www.example.com', path='/index.html', params='info', query='id=10086', fragment='comment')http httpwww.example.com www.example.com/index.html /index.htmlinfo infoid=10086 id=10086comment comment
复制代码


urlparse() 返回结果是一个 ParseResult 类型的对象。


其余内容


  • urlunparse() 方法与上述方法逻辑相反;

  • urljoin() 方法用于拼接链接;

  • urlencode():格式化请求参数;

  • quote():将内容转换为 URL 编码格式,尤其是转换中文字符

  • unquote():对 URL 进行解码。

提高场景

error 模块

urllib 中,error 模块定义异常,其包含如下类:


  • URLError:OSError 的一个子类,用于处理程序在遇到问题时会引发此异常;

  • HTTPError:URLError 的一个子类,用于处理特殊 HTTP 错误例如作为认证请求的时候

发布于: 刚刚阅读数: 4
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
【Python技能树共建】python urllib 模块_Python_梦想橡皮擦_InfoQ写作社区