urllib库是python内置的HTTP请求库。
包含以下四个模块:
1) request 最基本的HTTP请求模块,可以用来模拟发送请求。
2)error 异常处理模块
3)parse 一个工具模块,提供了许多URL处理方法,比如拆分,解析,合并等。
4)robotparser 用来识别网站的robots.txt文件,从而判断哪些网站可以爬,哪些网站不可以爬。
1.request 模块
1.1 urlopen()
import urllib.request
response = urllib.request.urlopen(url)
得到的response是一个HTTPResponse类型的对象,主要包含read(),readinto(),getheader(name),getheaders(),fileno()等方法,以及msg,version,status,reason等属性。
通过urlopen()得到response这个对象后,就可以调用上面提到的这些方法和属性,从而得到返回结果的一系列对象,
-
urlopen函数的API
Urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,cadefault=False,context=None)
-
data 参数
data参数是可选的,如果要添加这个参数,就需要使用bytes()方法将参数转化为字节流编码格式的内容,即bytes类型。如果使用了这个参数就不在是GET请求而是POST请求了。import urllib.parse import urllib.request data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf8') response = urllib.request.urlopen(url,data=data) print(response.read())
在这里我们传递了一个参数为word,值是hello。它需要被转码成bytes类型,采用的方法就是bytes()方法,该方法的第一个参数需要的是str类型,需要使用urllib.parse模块里的urlencode方法来将参数字典转换为字符串,第二个参数指定编码格式,这里指定为utf8。
-
timeout参数
该参数用于设置超时时间,单位为秒,超过设置的这个时间还没有得到响应就会抛出异常,如果不指定,就会使用全局默认时间。
-
1.2 Request
urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
URL用来请求URL,必传参数,其他的都是可选参数
data如果要传,就必须传bytes类型的,如果参数为字典,可以先用urllib.parse模块里的urlencode编码。
headers是一个字典,请求头,可以在构造请求是通过headers参数直接构造,也可以通过调用请求实例的add_header()方法添加re。
Method是一个字符串,用来指示请求使用的方法
1.3高级用法
-
代理
from urllib.error import UELError from urllib.request import ProxyHandler,build_opener proxy_handler = ProxyHandler({ 'http':'http://', 'https':'https://' }) opener = build_opener(proxy_handler) try: response = opener.open(url) print(response.read().decode('utf-8')) except URLError as e: print(e.reason)
这里使用了ProxyHandler其参数是一个字典,键名是协议类型(http或者https),键值是代理链接,可以添加多个代理IP。
然后利用这个Handler以及build_opener()方法构造了一个Opener,之后发送即可。
-
Cookies
-
获取网站的Cookies
import http.cookiejar,urllib.request cookie = http.cookiejar.CookieJar() handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) response = opener.oepn(url) for item in cookie: print(item.name+"="+item.value)
首先声明一个CookieJar对象,然后利用HTTPCookieProcessor来构建一个Handler,最后利用build_opener()方法来构建出opener,执行open即可。
-
以文件形式获取Cookie
filename = 'cookies.txt' cookie = http.cookiejar.MozillaCookieJar(filename) handler = urllib.request.HTTPCookieProcessor(cookie) opener = urllib.request.build_opener(handler) response = opener.oepn(url) cookie.save(ignore_discard=True,ignore_expires=True)
-
2.处理异常
urllib的error模块定义了由request模块产生的异常。
2.1URLError
URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以通过捕获和这个类来处理
这个类具有一个reason属性,即返回的错误的原因。
from urllib import request,error
try:
.....
except error.URLError as e:
print(e.reason)
2.2HTTPError
它是URLError的子类,专门用来处理HTTP请求错误。它有三个属性
code 返回HTTP状态码
reason 返回错误信息
headers 返回请求头
3解析链接
urllib库里提供了一个parse模块,定义处理URL的标准接口,例如实现URL各部分的抽取,合并以及链接转换
3.1 urlparse(urlstring,shcme='',allow_fragments=True)
- urlstring 必填项 待解析的url
- Scheme 默认的协议,如果这个链接没有带协议信息,会将这个作为默认的协议。
- allow_fragments 即是否忽略fragment,如果设置为False,则fragment部分就会被忽略,会成为其他的一部分,而fragment则为空
from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result),result)
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
从打印的结果可以看出,返回的是一个ParseResult类型的对象,它包含了6个部分,分别是scheme(协议,比如http,https),netloc(域名),path(访问路径),params(参数),query(问号后面的查询条件),fragment(#后面的内容).
一个标准的链接格式: scheme://netloc/path;params?query#fragment
3.2urlunparse()
与urlparse()方法的对立。它接受的参数是一个可迭代对象,长度必须为6,即传入6个参数,返回的结果是组装好的URL.
data = ['http','www.baidu.com','index.html','user','a=6','comment']
print(urlunparse(data))
得到的结果为
http://www.baidu.com/index.html;user?a=6#comment
3.3urlsplit()与urlunsplit()
这个方法和urlparse()方法类似,只不过不在解析parms这个部分,只返回五个结果。parms部分会合并到path中。
3.4 urljoin()
使用URLjoin方法 需要提供一个base_url作为第一参数,将新的链接作为第二个参数,然后会合成一个新的链接。
Base_url 提供了三项内容,scheme,netloc,path.如果这三项在新的链接中不存在就补充,如果新的链接存在,就使用新的链接中的部分。
3.5 urlencode() 与 parse_qs()
from urllib.parse import urlencode
params = {
'name':'germey',
'age':22
}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params)
print(url)
结果为:
http://www.baidu.com?name=germey&age=22
将字典类型转换为GET请求参数。
如果我们有一串GET请求参数,利用parse_qs()方法,就可以将参数转换为字典
3.5 quote()与unquote()
Quote将中文转化为URL编码的格式
from urllib.parse import quote
url_word = quote(keyword)
unquote将URL编码解码成中文