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