urllib概述
urllib是Python内置的HTTP请求库,是Python自带的库,只要安装了Python就有了。urllib主要包含4个模块:request,error,parse,robotparser。


request模块
request是提供了实现请求的方法:urlopen(),返回的是HTTPResponse对象。
urlopen()通过传参可以构造一个完整的请求,比较常用的参数有url,data,timeout:
  1. url就是我们要求请的超链接的地址;
  2. data参数是可选的,主要用于模拟表单提交,但是传递前需要将参数转化为字节流的格式:

dict = {
'name' : 'Tom',
'age' : 20
}
data = bytes(parse.urlencode(dict),encoding='utf-8')
respnse = request.urlopen(url='',data=data)

  3.timeout用于设置超时时间,单位是秒,如果请求超过了设置时间,就会抛出一个URLError异常;
  4.其他参数如context是设置SSL,cafile设置CA证书,capath设置CA证书路径。

HTTPResponse对象有很多方法和属性,常见的有:
  1.read(),返回网页的内容;
  2.getheaders(),返回响应头信息;
  3.getheader(),与getheaders()类似,只是要指定参数获取某一响应头的信息:

response = urllib.request.urlopen('https://baidu.com')
print(response.getheader('server'))
输出结果为BWS/1.1

  4.msg:请求是否成功;
  5.status:请求状态码;
request模块还有一个重要就是Request(),Request()主要是构建一个更加强大的请求:主要在于参数headers上,我们可以通过向headers传递一个字典,伪装成浏览器实现爬虫,其他参数和urlopen差不多。


error模块
error模块定义了请求是产生的异常,如果在请求时发生错误,就会抛出一个error模块定义的异常。捕获异常的作用是,当我们的程序发生错误时,不会因此程序的终止,同时也能够捕获异常的原因。
URLError:URLError继承了OSError类,是Error模块的基类;
HTTPError:是URLError的子类,专门用来处理HTTP请求错误。
若是请求一个不存在的页面,就会报出Not found的信息。

try:
response = request.urlopen('https://zhihu.com/notfound.html')
except error.URLError as e:
print(e.reason)

parse模块
parse模块提供了多种处理URL的API:
  1.urlparse():实现对URL的分段;

result = parse.urlparse('https://www.baidu.com/s;user?wd=爬虫&rsv_spt=1&issp=1')
print(result)
输出结果:ParseResult(scheme='https', netloc='www.baidu.com', path='/s', 
params='user', query='wd=爬虫&rsv_spt=1&issp=1', fragment='')

  2.urlunparse():可以理解为urlparse()的逆过程;
  3.urlsplit():与urlparse()类似,只是分段结果将params合并到path里去了;
  4.urlunsplit():urlsplit()的逆过程;
  5.urljoin():实现链接的合并;
  6.urlencode():将参数字典序列化为链接:

params = {
'name' : 'Tom',
'age' : 20
}
url = 'https:baidu.com?'
url = url + parse.urlencode(params)
print(url)
输出结果为:https:baidu.com?name=Tom&age=20

  7.parse_qs():urlencode()的逆过程,将参数转化为字典;
  8.parse_qsl():也是urlencode()的逆过程,只是将参数转化为列表与元组;
  9.quote():我们打开百度搜索中文字段时,会发现链接的搜索内容被编码了,利用quote()可以达到此效果,同时,这也是防止乱码的有效手段:

keyword = '爬虫'
url = 'https://www.baidu.com/s?wd=' + parse.quote(keyword)
print(url)
输出结果为:https://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB

  10.unquote():quote()的逆过程。


一个小案例:

from urllib import request
from urllib import error
from urllib import parse

base_url = 'https://www.baidu.com/s?'
data_dict = {
    'wd' : '爬虫'
}
url = base_url + parse.urlencode(data_dict)
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
    }
try:
    req = request.Request(url,headers=headers)
    response = request.urlopen(req)
    print(response.read().decode('utf-8'))
except error.HTTPError as e:
    if e.code == 404:
        print('Not Found!')