3.0版本中已经将urllib2、urlparse、和robotparser并入了urllib中,并且修改urllib模块。
其中包含5个子模块,即是help()中看到的那五个名字。
error 异常处理模块
parse url解析模块
request 请求模块
response
robotparser robots.txt解析模块
将每个包中包含的方法列举如下:
urllib.error: ContentTooShortError; HTTPError; URLError
urllib.parse: parseqs; parseqsl; quote; quotefrombytes; quote_plus; unquote unquoteplus;
unquoteto_bytes; urldefrag; urlencode; urljoin; urlparse; urlsplit; urlunparse; urlunsplit
urllib.request: AbstractBasicAuthHandler; AbstractDigestAuthHandler; BaseHandler; CatheFTPHandler;
FTPHandler; FancyURLopener; FileHandler; HTTPBasicAuthHandler; HTTPCookieProcessor;
HTTPDefaultErrorHandler; HTTPDigestAuthHandler; HTTPErrorProcessorl; HTTPHandler;
HTTPPasswordMgr; HTTPPasswordMgrWithDefaultRealm; HTTPRedirectHandler; HTTPSHandler;
OpenerDirector;ProxyBasicAuthHandler ProxyDigestAuthHandler; ProxyHandler; Request;
URLopener; UnknowHandler; buildopener; getproxies; installopener; pathname2url;
url2pathname; urlcleanup; urlopen; urlretrieve;
urllib.response: addbase; addclosehook; addinfo; addinfourl;
urllib.robotparser: RobotFileParser
https://docs.python.org/3/library/urllib.html
urllib.request
urllib.request.urlopen()
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) 常用参数: url:要访问网址的 url,也可以是其他,例:Request data : 可选。如果有该参数,则请求会变成post方式,传递的参数需要通过urllib.parse.urlencode转为bytes timeout:设置访问网站的超时时间 其他参数: context:它必须是 ssl.SSLContext 类型,用来指定 SSL 设置。 cafile 和 capath :是指定CA证书和它的路径,这个在请求 HTTPS 链接时会有用。 cadefault :现在已经弃用了,默认为 False from urllib import request url = 'http://www.baidu.com' response = request.urlopen(url) print(response.getcode()) print(response.read()[:100]) 结果: 200 b'<!DOCTYPE html>\n<!--STATUS OK-->\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\ r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\ n\r\n\r\n\r\n\r\n\r\n\r.............' 结果返回一个二进制的对象response,对这个对象进行read()操作可以得到一个包含网页的二进制字符串,可以用decode()解码成html
urlopen返回对象提供方法: read() , readline() ,readlines() , fileno() , close() :对HTTPResponse类型数据进行操作 info():返回HTTPMessage对象,表示远程服务器返回的头信息 getcode():返回Http状态码 geturl():返回请求的url
urllib.request.Request()
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
常用参数: url:访问的地址。 data:可选。如果有该参数,则请求会变成post方式,传递的参数需要通过urllib.parse.urlencode转为bytes headers:http相应headers传递的信息。构造方法:通过调用 Request 对象的 add_header() 方法来添加请求头。 其他参数: origin_req_host :指的是请求方的 host 名称或者 IP 地址。 unverifiable :用来表明这个请求是否是无法验证的,默认是 False 。 意思就是说用户没有足够权限来选择接收这个请求的结果。如果没有权限,这时 unverifiable 的值就是 True 。 method :用来指示请求使用的方法,比如 GET,POST,PUT 等
# headers = {'User-Agent': 'Mozilla/5.0'} # req = request.Request(url,headers=headers) req = request.Request(url) req.add_header('user-agent', 'Mozilla/5.0') response2 = request.urlopen(req) print(response2.getcode()) print(response2.read()[:20])
urllib.request.HTTPCookieProcessor(cookie操作)
通过 urllib.request.HTTPCookieProcessor(cookie) 来操作cookie。 在HTTP包中,提供了cookiejar模块,用于提供对Cookie的支持。http.cookiejar功能强大, 我们可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送,比如可以实现模拟登录功能。 该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
cj = http.cookiejar.CookieJar() opener = request.build_opener(request.HTTPCookieProcessor(cj)) request.install_opener(opener) response3 = request.urlopen(url) print(response3.getcode()) print(cj) print(response3.read()[:20])
urllib.error
用 try-except来捕捉异常,主要的错误方式就两种 URLError(错误信息)和HTTPError(错误编码). try: data=urllib.request.urlopen(url) print(data.read().decode('utf-8')) except urllib.error.HTTPError as e: print(e.code) except urllib.error.URLError as e: print(e.reason)
urllib.parse
urllib.parse.urlparse将对应的URL解析成六部分,并以元组的数据格式返回来。
>>> from urllib.parse import urlparse
>>> o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
>>> o
ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
params='', query='', fragment='')
>>> o.scheme
'http'
>>> o.port
80
>>> o.geturl()
'http://www.cwi.nl:80/%7Eguido/Python.html'
参数
result = urlparse('url',scheme='https')解析协议 可以去掉http://
result = urlparse('url',scheme='http')
result = urlparse('url',allow_fragments=False) url带有查询参数
result = urlparse('url',allow_fragments=False) url不带有查询参数
urllib.parse.urlunparse
拼接url from urllib.parse data = ['http','www.baidu.com','index.html','user','a=1','comment'] print(urllib.parse.urlunparse(data))
urllib.parse.urljoin
用来拼接url的方法 或者叫组合方法,url必须为一致站点,否则后面参数会覆盖前面的host from urllib.parse import urljoin >>> from urllib.parse import urljoin >>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html') 'http://www.cwi.nl/%7Eguido/FAQ.html'
>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', ... '//www.python.org/%7Eguido') 'http://www.python.org/%7Eguido'
urllib.parse.quote(string[, safe]) # url_ = quote(url, safe=string.printable)
除了三个符号“_.-”外,将所有符号编码,后面的参数safe是不编码的字符,使用的时候如果不设置的话, 会将斜杠,冒号,等号,问号都给编码了。
urllib.quote(url)和urllib.quote_plus(url) 将url数据获取之后,并将其编码,从而适用与URL字符串中,使其能被打印和被web服务器接受。 urllib.unquote(url)和urllib.unquote_plus(url) # 与上面的相反 urllib.urlencode(query) 将URL中的键值对以连接符&划分 这里可以与urlopen结合以实现post方法和get方法: GET方法: >>> import urllib >>> params=urllib.urlencode({'spam':1,'eggs':2,'bacon':0}) >>> params 'eggs=2&bacon=0&spam=1' >>> f=urllib.urlopen("http://python.org/query?%s" % params) >>> print f.read() POST方法: >>> import urllib >>> parmas = urllib.urlencode({'spam':1,'eggs':2,'bacon':0}) >>> f=urllib.urlopen("http://python.org/query",parmas) >>> f.read()