python之urllib简介

3.0版本中已经将urllib2、urlparse、和robotparser并入了urllib中,并且修改urllib模块。

其中包含5个子模块,即是help()中看到的那五个名字。

PACKAGE CONTENTS
    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()

 

猜你喜欢

转载自blog.csdn.net/qq_42413820/article/details/80735106