一、什么是 urllib 库?
Python3 中将 Python2 中的 urllib 和 urllib2 两个库整合为一个 urllib 库,所以现在一般说的都是 Python3 中的 urllib 库,那么 urllib 库是什么呢?如何使用 urllib 库?urllib 库的常用函数有哪些呢?
urllib主要分为以下四个功能模块:
- urllib.request(请求模块)
- urllib.parse(解析模块)
- urllib.error(异常处理模块)
- urllib.robotparser(robots.txt 文件解析模块)
urllib 是 Python 内置的 HTTP 请求库,无需安装,可直接使用,也是爬虫开发人员常用的一个库,今天小编就给大家总结一下 urllib 库一些常用函数的基本用法。
二、urllib用法讲解
1、urllib.request.urlopen() 函数
创建一个标识远程 url 的文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。语法如下:
urllib.request.urlopen(url,data = None,[timeout]*,cafile = None,capath = None,cadefault = False,context = None)
- url:请求的 url;
- data:请求的 data,如果设置了这个值,那么将变成 post 请求;
- timeout:设置网站的访问超时时间句柄对象;
- cafile和capath:用于 HTTPS 请求中,设置 CA 证书及其路径。
示例
from urllib import request
response = request.urlopen('http://www.baidu.com') #get方式请求
print(response.read().decode('utf-8') #获取响应的内容并进行解码操作
urlopen() 返回对象提供的方法有:
- read()、readline()、readlines()、fileno()、close():对 HTTPR esponse 类型数据进行操作;
- info():返回 HTTPMessage 对象,表示远程服务器 返回的头信息 ;
- getcode():返回 HTTP 状态码 geturl():返回请求的 url;
- getheaders():响应的头部信息 ;
- getheader('Server'):返回响应头指定参数 Server 的值;
- status:返回状态码 ;
- reason:返回状态的详细信息 。
2、urllib.request.urlretrieve() 函数
这个函数可以方便的将网页上的一个文件保存到本地。语法如下:
urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)
- url:远程数据的地址 ;
- filename:保存文件的路径,如果为空,则下载为临时文件 ;
- reporthook:钩子函数 连接服务器成功以及每个数据块下载完成时各调用一次,包含 3 个参数,依次为已经下载的数据块,数据块的大小,总文件的大小,可用于显示下载进度 ;
- data:post 到服务器的数据。
示例
from urllib import request
request.urlretrieve('http://www.baidu.com/','baidu.html') #将百度的首页信息下载到本地
3、urllib.parse.urlencode() 函数
urlencode 可以把字典数据转换为 URL 编码的数据。语法如下:
urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)
- query:查询参数;
- doseq:序列元素是否单独转换;
- safe:安全默认值;
- encoding:编码;
- errors:错误默认值;
- quote_via:查询参数的成份是str时,safe, encoding, errors 传递给的指定函数,默认为 quote_plus(),加强版 quote()。
示例
from urllib import parse
data = {'姓名':'W3CSchool','问好':'Hello W3CSchool','年龄':100}
qs = parse.urlencode(data)
print(qs)
# %E5%A7%93%E5%90%8D=W3CSchool&%E9%97%AE%E5%A5%BD=Hello+W3CSchool&%E5%B9%B4%E9%BE%84=100
4、urllib.parse.parse_qs() 函数
可以将经过编码后的 url 参数进行解码。语法如下:
urllib.parse.parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace')
- keep_blank_values:当 value 为空时,表示是否需要显示 key,默认为 False
- strict_parsing:指示如何处理解析错误的标志。如果为 False(默认值),则会自动忽略错误。否则错误会引发 ValueError 异常。
示例
from urllib import parse
data = {'姓名':'W3CSchool','问好':'hello W3CSchool','年龄':100}
qs = parse.urlencode(data)
print(qs)
#%E5%A7%93%E5%90%8D=W3CSchool&%E9%97%AE%E5%A5%BD=hello+W3CSchool&%E5%B9%B4%E9%BE%84=100
print(parse.parse_qs(qs))
#{'姓名': ['W3CSchool'], '问好': ['hello W3CSchool'], '年龄': ['100']}
5、urllib.parse.parse_qsl() 函数
基本用法与 parse_qs() 函数一致,只是 urllib.parse.parse_qs() 函数返回字典,urllib.parse.parse_qsl() 函数放回列表。语法如下:
urllib.parse.parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace')
示例
from urllib import parse
data = {'姓名':'W3CSchool','问好':'hello W3CSchool','年龄':100}
qs = parse.urlencode(data)
print(parse.parse_qs(qs))
#[('姓名', 'W3CSchool'), ('问好', 'hello W3CSchool'), ('年龄', '100')]
6、urllib.parse.urlparse() 和 urllib.parse.urlsplit() 函数
有时候拿到一个 url,想要对这个 url 中的各个组成部分进行分割,那么这时候就可以使用 urlparse 或者是 urlsplit 来进行分割。 各自语法如下:
urllib.parse.urlparse(urlstring, scheme=”, allow_fragments=True)
urllib.parse.urlsplit(urlstring, scheme=”, allow_fragments=True)
urlparse 和 urlsplit 基本上是一模一样的。
唯一不一样的地方是: urlparse 里有 params 属性,而 urlsplit 没有这个 params 属性。
示例
from urllib import parse
url = 'http://www.baidu.com/index.html;user?id=S#comment'
result = parse.urlparse(url)
# result = parse.urlsplit(url)
print(result)
print(result.scheme)
print(result.netloc)
print(result.path)
print(result.params) # urlparse 里面有 params 属性,而 urlsplit 没有这个属性。
7、urllib.error 模块
urllib 的 error 模块定义了由 urllib.request 请求产生的异常。如果请求失败,urllib.request 便会抛出 error 模块的异常。
- URLError
示例
from urllib import request, error
try:
resp = request.urlopen('https://zijiebao.c/index.html')
except error.URLError as e:
print(e.reason)
# [Errno 11001] getaddrinfo failed
- HTTPError
它是 URLError 的子类,专门用来处理 HTTP 请求错误,具备以下三个属性:
- code:返回HTTP状态码
- reason:异常原因
- headers:请求头
示例
from urllib import request
response = request.urlopen('http://www.baidu.com') #get方式请求
print(response.read().decode('utf-8') #获取响应的内容并进行解码操作
#404
当然,大多时候都是将 URLError 和 HTTPError 结合才进行异常处理,首先通过 HTTPError 来捕获 url 的错误状态码、异常原因、请求头等信息,如果不是该类型错误,再捕获 URLError,输出错误原因,最后是 else 来处理正常的逻辑。
示例
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
resp = Request('http://www.baidu.cnc/')
try:
response = urlopen(resp)
except HTTPError as e:
print('(www.baidu.cnc)服务器无法完成请求。')
print('错误代码: ', e.code)
except URLError as e:
print('我们无法连接到服务器。')
print('原因: ', e.reason) else:
print("链接成功!")
print(response.read().decode("utf-8"))
以上就是 urllib 库中常用的函数,希望屏幕前的你多注重联系,理论与实际相结合才是最好的学习方式!推荐阅读:Python 静态爬虫、Python Scrapy网络爬虫。
最后,我们来总结一下常见的各种状态码含义:
- 200:请求正常,服务器正常的返回数据;
- 301:永久重定向。比如在访问 www.jingdong.com 的时候会重定向到 www.jd.com;
- 302:临时重定向。比如在访问一个需要登录的页面的时候,而此时没有登录,那么就会重定向到登录页面;
- 400:请求的url在服务器上找不到。换句话说就是请求url错误;
- 403:服务器拒绝访问,权限不够;
- 500:服务器内部错误。可能是服务器出现 bug 了。