最适合小白上手的爬虫库----urllib库常用函数详解

2020-12-09 15:39:25 浏览数 (53)

一、什么是 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() 返回对象提供的方法有:

  1. read()、readline()、readlines()、fileno()、close():对 HTTPR esponse 类型数据进行操作;
  2. info():返回 HTTPMessage 对象,表示远程服务器 返回的头信息 ;
  3. getcode():返回 HTTP 状态码 geturl():返回请求的 url;
  4. getheaders():响应的头部信息 ;
  5. getheader('Server'):返回响应头指定参数 Server 的值;
  6. status:返回状态码 ;
  7. 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
URLError 类来自 urllib 的 error 模块,是继承 OSError 模块,是异常模块的基类,具有属性 reason,即返回错误原因。

示例

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 请求错误,具备以下三个属性:

  1. code:返回HTTP状态码
  2. reason:异常原因
  3. 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 了。 


2 人点赞